【问题标题】:Problem with filtering javascript multidimensional array of object过滤javascript多维对象数组的问题
【发布时间】:2022-06-10 17:33:57
【问题描述】:

我想从多层 JSON 对象中过滤掉数据:

    var players = [
    0:{
        id: "1"
        stats: 
        { 
          yellow_cards: "0" 
          saves: "0" 
        }
        explain: 
        [
        0:{
            fixture: "251"   
            stats: [
            0:{
                identifier: "minutes"
                points: "2" 
                value: "75"
              }  
            ] 
          }
        1:{ 
            fixture: "191" 
            stats: 
            [
            0:{
                identifier: "minutes"
                points: "2" 
                value: "83"
              }  
            1:{
                identifier: "assists"
                points: "3"
                value: "1"
              }
            ]
          }
        ]
      }
    ]    

我想整理出至少有一个标识符 =“分钟”且值在 50 到 60 之间的对象的玩家。如果我循环遍历所有内容,它工作正常:

var selected = [];
  for(i=0; i<players.length; i++){
    for(j=0; j<players[i].explain.length; j++){
      for(k=0; k<players[i].explain[j].stats.length;k++){
        if(players[i].explain[j].stats[k].identifier == "minutes"){
          if(players[i].explain[j].stats[k].value >50 && players[i].explain[j].stats[k].value < 60) { 
            selected.push(players[i]);
          }
        }
      }
    }
  }

这需要太多时间,而且我确信有一种更优雅的方法可以使用数组过滤器和查找函数来完成此操作。对此的任何帮助都非常感谢。

编辑:为了保持简短,上面的数组只显示了一个不符合条件的对象。

【问题讨论】:

  • 请尝试:selected = players.filter(({ explain }) =&gt; explain.some(({ stats }) =&gt; stats.some(({ identifier, value }) =&gt; ( identifier === 'minutes' &amp;&amp; value &gt; 50 &amp;&amp; value &lt; 60 )))); 并分享您的反馈。这是非常不言自明的代码 - 但如果需要,我们可以发布带有解释的答案。
  • 运行了一些场景,效果很好,需要再运行几个,但这似乎正是我想要的。谢谢!

标签: javascript arrays multidimensional-array filter


【解决方案1】:

您可以通过Array.filter()Array.some() 来实现相同的要求,而不是使用这种传统的for 循环

演示

var players = [{
  id: "1",
  stats: { 
    yellow_cards: "0", 
    saves: "0" 
  },
  explain: [{
    fixture: "251", 
    stats: [{
      identifier: "minutes",
      points: "2",
      value: "75"
    }] 
  }, { 
    fixture: "191", 
    stats: [{
      identifier: "minutes",
      points: "2",
      value: "83"
    }, {
      identifier: "assists",
      points: "3",
      value: "1"
    }]
  }]
}];

const selected = players.filter(({ explain }) => {
  return explain.some(({ stats }) => {
    return stats.some(({ identifier, value }) => {
      return identifier === "minutes" && (value > 50 && value < 60)
    })
  })
})

console.log(selected);

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 2021-05-24
    • 2010-11-18
    • 2020-02-17
    • 2020-07-04
    • 2018-11-15
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多