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

标签 javascript arrays

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

相关文章:

使用它自己的字段的javascript对象文字

php - 使用 array_filter 或 array_walk 从数组中删除项目

javascript - 对 Javascript 数组进行排序

javascript - 使用 Javascript 为 Apple 平台编写应用程序

javascript - Stripe 错误 - 您的卡的到期年份无效

java - 格式化数组元素

ruby - 将数组转换为哈希键

python - 将结果写入 .txt 文件

javascript - 具有不同回调处理程序的单例 Websockets 对象

php - 在提交时检查文本框中所需文本的代码