【问题标题】:Iterating over json objects in array遍历数组中的 json 对象
【发布时间】:2016-05-05 08:52:38
【问题描述】:

我有一个名为 mainarray 的数组,它有多个 json 对象。

mainarray:Object
  >key1: Array[30]
  >key2: Array[20]

我想对 Array[30] 和 Array[20] 进行排序。 我正在尝试这样做:

mainarray.forEach((arrayinner)
{
  //sort
});

但我收到错误:无法读取未定义的属性。

如何迭代?而且键名是动态的,我无法对其进行硬编码并开始迭代/

【问题讨论】:

  • 请使用array这个词作为变量名,只用于数组,不能用于对象。它让生活更轻松。
  • 您需要在传递的参数之后放置一个箭头,例如 mainarray.forEach((arrayinner) => { // sort }) 实际上对于单个参数,您甚至不需要括号并且像 mainarray.forEach(arrayinner => { // sort }) 那样做,然后内联箭头背后的想法是缩短代码。所以使用长变量名没有意义,你可以减少你的代码更像mainarray.forEach(a => { // sort })

标签: javascript jquery arrays json


【解决方案1】:

您需要 function 关键字来声明有效的回调。

mainarray.forEach(function (arrayinner)
//                ^^^^^^^^
{
  //sort
});

但问题更深:

您需要获取键并对其进行迭代并获取属性值以应用排序

Object.keys(mainarray).forEach(function (key) {
    mainarray[key].sort();
});

【讨论】:

    【解决方案2】:

    您可以获取要迭代的键数组

    Object.keys ( mainarray ).forEach( function( arrayinner ){
      arrayinner.sort();
    });
    

    如果mainarray里面的所有key可能没有Array值,那么你可以在排序前检查

    Object.keys ( mainarray ).forEach( function( arrayinner ){
      Array.isArray( arrayinner ) || arrayinner.sort();
    });
    

    【讨论】:

      【解决方案3】:

      你可以使用$.each来做到这一点

      $.each(mainarray, function(key,val){
        val.sort((a,b) => {return a > b ? 1 : a < b ? -1 : 0});
      });
      

      因为val 是一个数组,也就是一个对象。它的引用将在 callBack 函数内部共享。所以影响callBack里面的那个数组会影响到原来的数组。

      DEMO

      【讨论】:

        【解决方案4】:

        您可以通过遍历对象本身的属性并对它们包含的数组进行排序来实现这一点,如下所示:

        for (var key in mainarray) {
            if (mainarray[key] === Array)
                mainarray[key].sort();
        }
        

        Working example

        请注意,默认情况下sort() 仅使用基本的字母数字排序逻辑。如果您需要更复杂的东西,您需要自己实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-16
          • 1970-01-01
          • 1970-01-01
          • 2016-07-28
          相关资源
          最近更新 更多