gpt4 book ai didi

javascript - JavaScript 数组中的最后一个键显示为长度?

转载 作者:行者123 更新时间:2023-12-03 05:01:00 25 4
gpt4 key购买 nike

有点奇怪。我使用以下代码从 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;
}
}
}

生成的数组如下所示:

resulting array

知道这里发生了什么吗?

编辑:下面的 Json 示例

{"Extras":{"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(); })
: [];

关于javascript - JavaScript 数组中的最后一个键显示为长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42225710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com