【问题标题】:JavaScript - Filter Nested ArraysJavaScript - 过滤嵌套数组
【发布时间】:2015-09-14 18:25:41
【问题描述】:

我正在尝试在 javascript 中过滤数组,并且在嵌套数组时遇到了困难。

目前,我能得到的最远的结果是过滤一个平面数组:

var ID = 3

var arr = [{ id : 1, name: "a" }, { id : 2, name: "b" }, { id : 3, name: "c" }]

var result = arr.filter(function( obj ) {return obj.id == ID;});
alert(result[0].name);

虽然如果数组看起来像这样,上述方法不起作用:

var arr2 = [
    [{ id : 1, name: "a" },{ id : 2, name: "b" }],
    [{ id : 3, name: "c" },{ id : 4, name: "d" }]
] 

这两个例子可以找到:https://jsfiddle.net/vjt45xv4/

任何在嵌套数组上查找适当结果的提示将不胜感激。

谢谢!

【问题讨论】:

  • 如果数组看起来像这样,你希望结果是什么? (或者你只想找到一个对象?)
  • arr2 中的每个项目应用您在arr 上使用的相同过滤器(因为arr2 中的项目本身就是数组)

标签: javascript arrays


【解决方案1】:
arr2.filter(function(obj) {

  obj.filter(function(d) { 

    if(d.id == ID) { 

      result = d;

    }

  })

});

alert(result.name);

希望这就是您想要的。我没有在这里展平数据,而是进入嵌套数组,直到它变平(和匹配)并在那里设置结果。

arr2.forEach(function(d) {

  d.forEach(

    function(dd){ 

      alert(dd.id);

      if (dd.id==ID){

        result=dd; 

      }

    }

  );

});

alert(result.name);

编辑:正如 minitech 提到的,如果只使用 forEach,它的工作原理是一样的。

【讨论】:

  • 如果你要赋值给一个变量,为什么不直接使用forEach
  • 是的,没有任何争论可以做到!此外,如果不寻找解决方法,我想 John Strickler 提到的方式是正确的方式。
【解决方案2】:

Flatten 数组然后过滤它:

arr.reduce(function(a,b) { return a.concat(b);  })
   .filter(function(obj) { return obj.id == ID; });

【讨论】:

    【解决方案3】:

    我从一个类似的问题中找到了这个问题:

    我有一个这样的数据结构:

    x.suites[0].specs[0].tests[0].results[0].status == "skipped"
    

    我的目标是标记位于此结构深处某处的所有非 [跳过/忽略/???] 状态。

    我想出了这个解决方案:

    var ignoreStatus = ["skipped"];
    x.suites
    .forEach( (xsuit)=> { xsuit.specs
        .forEach( (xspec)=> { xspec.tests
            .forEach( (xtst)=> { 
                    var arry=xtst.results.filter((ftst)=>{ 
                        return !ignoreStatus.includes(ftst.status)
                    });
                    if(arry.length>0){ 
                        console.log(`!!!Flag this:${arry}`) 
                    } else { 
                        console.log("ignored:" ,xtst.results.map(m=>{return m.status}).join("/") ); 
                    } 
                    
            })
        })
    }) 
    
    
    

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 2022-08-19
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 2019-10-15
      • 2019-04-14
      • 2017-09-01
      相关资源
      最近更新 更多