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


结果数组如下所示:

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

有什么想法吗?

编辑:
下面的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(); })
    : [];

09-26 06:09