有点奇怪。我正在使用以下代码从json对象构建一个数组,以使其在以后的代码中更易于引用。但是,似乎在创建每个数组的最后一个项目时,而不是添加新项目时,该项目的键显示为数组的长度。
perfsJson = $.parseJSON(result);
var extras = new Array();
for (var i = perfsJson.length - 1; i >= 0; i--) {
var obj = perfsJson[i];
if (obj != null) {
if (obj.Extras != null) {
for (var perf_no in obj.Extras) {
if (extras[perf_no] == undefined) {
var arr = new Array();
for (var extra in obj.Extras[perf_no]) {
if (arr[extra] == undefined) {
arr[extra] = obj.Extras[perf_no][extra];
}
}
extras[perf_no] = arr;
}
}
break;
}
}
}
结果数组如下所示:
有什么想法吗?
编辑:
下面的Json示例
{“其他”:{“ 32516”:{“ 24186”:“示例文本”},“ 32515”:{“ 24186”:“示例文本”},“ 32514”:{“ 24186”:“示例文本”} ,“ 32512”:{“ 24186”:“示例文本”},“ 32513”:{“ 24186”:“示例文本”},“ 32511”:{“ 24186”:“示例文本”},“ 32510”: {“ 24186”:“示例文本”},“ 32509”:{“ 24186”:“示例文本”},“ 32507”:{“ 24186”:“示例文本”},“ 32503”:{“ 24186”: “示例文本”},“ 32506”:{“ 24186”:“示例文本”},“ 32505”:{“ 24186”:“示例文本”},“ 32508”:{“ 24186”:“示例文本”} ,“ 32502”:{},“ 32497”:{}}}
最佳答案
所听到的是您正在使用for..in
遍历数组,这是不可以的,因为它会遍历不是数组元素的属性(例如.length
属性)。而是使用Array#forEach
:
perfsJson = $.parseJSON(result);
var extras = new Array();
for (var i = perfsJson.length - 1; i >= 0; i--) {
var obj = perfsJson[i];
if (obj != null) {
if (obj.Extras != null) {
obj.Extras.forEach(function (item, idx) {
if (typeof extras[idx] === 'undefined') {
var arr = new Array();
item.forEach(function (item2, idx2) {
if (typeof arr[idx2] === 'undefined') {
arr[idx2] = item2;
}
});
extras[idx] = arr;
}
});
break;
}
}
}
最里面的循环是毫无意义的,可以用
Array#slice
代替:perfsJson = $.parseJSON(result);
var extras = new Array();
for (var i = perfsJson.length - 1; i >= 0; i--) {
var obj = perfsJson[i];
if (obj != null) {
if (obj.Extras != null) {
obj.Extras.forEach(function (item, idx) {
if (typeof extras[idx] === 'undefined') {
extras[idx] = item.slice();
}
});
break;
}
}
}
下一个内部循环可以用
Array#map
替换,并且可以组合两个if
语句:perfsJson = $.parseJSON(result);
var extras = new Array();
for (var i = perfsJson.length - 1; i >= 0; i--) {
var obj = perfsJson[i];
if (obj != null&& obj.Extras != null) {
extras = obj.Extras.map(function (item) {
return item.slice();
});
break;
}
}
实际上,大多数代码可以简化:
function findLastElement(arr) {
for (var i = arr.length - 1; i >= 0; i -= 1) {
if (arr[i] != null && arr[i].Extras != null) { return arr[i]; }
}
}
perfsJson = $.parseJSON(result);
var lastElement = findLastElement(perfsJson);
var extras = lastElement
? lastElement.Extras.map(function (item) { return item.slice(); })
: [];