1

我基本上需要做的是,给定一个像

{
  "1" : "a",
  "7" : "something"
  "3" : {
      "1" : "blah"
  }
}

将这些转换为数组(比如 x)。

x[1] = "a"
x[7] = "something"
x[3] = y (where y[1] = "blah")
4

4 回答 4

0

这对我有用:

var obj = JSON.parse('{"1":"a","7":"something","3":{"1":"blah"}}');
var keys = Object.keys(obj).sort();

// Make obj look like it's an array by taking the highest value
// key and using it to give obj a length property.
obj.length = parseInt( keys[keys.length] ) + 1;

var arr = Array.prototype.slice.call(obj, 0);

arr 现在看起来像这样:

[undefined, "a", undefined, Object, undefined, undefined, undefined, "something"]

好的,所以它没有将“内部”JSON 对象转换为数组,但是执行与上述相同操作的快速递归循环应该可以解决这个问题。

于 2012-06-05T22:23:19.727 回答
0

您需要将 JSON 反序列化为非数组对象图,然后将属性复制到数组中。我不知道它有什么捷径。

将 JSON 反序列化后的基本循环obj大致是:

var ar;
var key;

ar = [];
for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        ar[key] = obj[key];
    }
}

...除了你必须检测到它obj[key]是一个对象并递归,我将把它作为练习留给读者。


请注意,在 JavaScript 中,数组并不是真正的数组。根据您的用例,您可能根本不需要进行从对象到的转换Array

于 2012-06-05T22:00:53.527 回答
0

我很确定在 Javascript 中,您可以访问:

x = {
  "1" : "a",
  "7" : "something",
  "3" : {
      "1" : "blah"
  }
}

像这样:

alert( x["1"] );

这应该提醒“a”。正如人们在上面的评论中已经提到的那样,JS 中的数组已经是一个“对象”,这两种不同的方式访问它们没有区别。

编辑:

是的,我刚刚测试过它并且它有效。另外,我试过这个:

alert( x[1] );

也就是说,我尝试使用“数字”1,而不是“字符串”“1”。它仍然有效。是的,它是一种非常奇怪的编程语言。

于 2012-06-05T22:04:28.973 回答
0

我认为这非常接近:

function parse_obj(obj)
{
    var array = [];
    var prop;
    for (prop in obj)
    {
        if (obj.hasOwnProperty(prop))
        {
            var key = parseInt(prop, 10);
            var value = obj[prop];
            if (typeof value === "object")
            {
                value = parse_obj(value);
            }
            array[key] = value;
        }
    }
    return array;
}

http://jsfiddle.net/shaggyfrog/DFnnm/

于 2012-06-05T22:19:04.403 回答