【问题标题】:How to do a loop in JSON from the last record JQuery如何从最后一条记录 JQuery 在 JSON 中执行循环
【发布时间】:2017-07-27 04:32:28
【问题描述】:

我有一个这样的 JSON:

var arrStages = [                 
    { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
    { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
    { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
    { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
    { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
    { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
];

如何获取每条记录的特定属性的值(例如 intStageNum),但我必须倒退。我必须从最后一条记录开始循环,即

{ "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 }

有什么办法吗?

【问题讨论】:

  • 为什么要从最后一条记录开始循环?
  • 我有几行代码,但为了让它工作,循环应该从最后一条记录开始。
  • 复制数据,并反转复制,然后照常循环

标签: javascript jquery html json loops


【解决方案1】:

试试下面的循环:

var arrStages = [                 
    { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
    { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
    { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
    { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
    { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
    { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
];

for (var i=(arrStages.length-1); i>=0; i--){
  console.log(arrStages[i]['intStageNum']);
}

【讨论】:

    【解决方案2】:
    for (var i=arrStages.length - 1; i >= 0; i--){
        console.log(arrStages[i].intStageNum);
    }
    

    【讨论】:

      【解决方案3】:

      使用“reduceRight”怎么样?

      arrStages.reduceRight(function(nothing, record){
           yourCheckFunction(record);
      },0);
      

      【讨论】:

        【解决方案4】:

        2 种方式。

        1) 通常的方式。使用 i-- 循环从 arrStages.length-1 返回到 arrStage[0]

        2) 执行 while 循环和弹出元素。 (假设您需要通过从数组末尾删除元素来释放内存。

        由于两者都经过 n 个对象,所以它是 O(n)。您在这里的性能确实没有任何好处。但这只是一种选择。

        我个人不太喜欢 .reverse ,因为在你反转它之后,你仍然需要再次执行 for 循环。它循环了两次.. 但是:p 我认为这并不重要。

        var arrStages = [                 
            { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
            { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
            { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
            { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
            { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
            { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
        ];
        
        while (arrStages.length > 0) {
          poped = arrStages.pop();
          console.log(poped.intStageNum);
        }

        【讨论】:

          【解决方案5】:

          你可以先用 reverse() 方法反转数组,然后用 foreach 循环开始迭代它。因为 reverse() 正在改变数组,所以你可以尝试如下操作

          var arrStages = [                 
              { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
              { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
              { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
              { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
              { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
              { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
          ];
          arrStages.reverse();
          arrStages.forEach((element) => {
              console.log(element);
          });
          

          或者你可以像这样从最后一个索引开始循环

          for(var i=arrStages.length - 1; i >= 0; i--)

          并且由于您需要迭代所有数组,因此如果您有更大的数组,那么对于 O(n) 复杂性,然后使用 for 循环从头到尾。

          【讨论】:

            【解决方案6】:

            其他答案一直在为您提供一种迭代方法:我认为最好使用forEachmap 方法,因为它使代码更易于阅读。

            一些解决方案只是在 for 循环中写入 arrStages["intStageNum"]。如果您想查找其他属性,这是不可扩展的。

            相反,我们定义了一个函数findElement,它接受两个参数arrayelement。这些论点应该是不言自明的。

            最后,我们不想改变数组,所以我们不应该调用array.reverse。相反,this SO post 告诉我们改用array.slice.reverse

                var arrStages = [                 
                    { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
                    { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
                    { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
                    { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
                    { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
                    { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 }
                ];
                
                
                function findElement(array, attr) {
                	array.forEach((element) => {
                  		console.log(element[attr]);
                  });
                }
                
                findElement(arrStages.slice().reverse(), "intStageNum");

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-10-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-09-18
              • 1970-01-01
              • 2019-03-28
              • 2023-03-06
              相关资源
              最近更新 更多