【问题标题】:Iterating over nested array of objects [duplicate]迭代嵌套的对象数组[重复]
【发布时间】:2017-04-14 11:42:51
【问题描述】:

我正在尝试迭代这个包含任务对象数组的对象。我如何能够遍历每个键值对以例如返回所有状态为“已完成”的任务。

{
    "quests": [
        {
            "title": "A Rum Deal",
            "status": "COMPLETED",
            "difficulty": 2,
            "members": true,
            "questPoints": 2,
            "userEligible": true
        }
    ],
    "loggedIn": false
}

【问题讨论】:

  • 迭代还是返回?
  • 我认为您不想“遍历每个键值对”。您想遍历数组中的 elements。键/值对是对象的一个​​特征;元素是数组的一个特征。顺便说一句,即使您不知道“过滤器”这个词,Google 搜索 find matching object array javascript property 也会立即找到答案。

标签: javascript arrays loops


【解决方案1】:

使用Array.prototype.filter 过滤掉状态为“已完成”的元素 - 参见下面的演示:

var array={"quests":[{"title":"A Rum Deal","status":"COMPLETED","difficulty":2,"members":0,"questPoints":2,"userEligible":0},{"title":"A Rum Deal","status":"NOT_COMPLETED","difficulty":2,"members":0,"questPoints":2,"userEligible":0}],"loggedIn":1};

var result = array.quests.filter(function(e){
   return e.status && e.status === "COMPLETED";
});

console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}

【讨论】:

  • e.status && 部分的意义何在?
  • 检查status是否是e的属性
  • 没必要。如果status 不是e 的属性,那么e.status 将是未定义的,这将不等同于"COMPLETED"
  • 你说得对,写那张支票已经成为我的习惯了:)
【解决方案2】:

这就是JavaScript filters 的用途。

myObj.quests.filter(item => item.status === 'COMPLETED');

【讨论】:

    【解决方案3】:

    对于迭代,您可以使用Array#forEach

    object.quests.forEach(function (a) {
        if (a.status === "COMPLETED") {
            // do something with the data
        }
    });
    

    要返回已完成任务的选择,您可以使用Array#filter

    var completed = object.quests.filter(function (a) {
        return a.status === "COMPLETED";
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多