【问题标题】:Dynamically build expression to filter Javascript array动态构建表达式以过滤 Javascript 数组
【发布时间】:2017-10-11 22:15:21
【问题描述】:

我需要根据另一个数组中可变数量的项目来过滤一个数组。 说我要过滤的数组如下所示:

var toBeFiltered = [
  {name:"A", parentId: 0},
  {name: "B", parentId: 3},
  {name: "C", parentId: 0},
  {name: "D", parentId: 1},
  ...
]

我需要过滤parentId 在另一个数组中的所有元素(比如:var filtering = [3,1,0],但它可以有任何长度)。 如何根据 filtering 数组的内容动态构建过滤器表达式?在这种情况下,我会得到这个表达式:

function(d){return d.parentId == 3 || d.parentId == 1 || d.parentId == 0;}

有什么聪明的方法可以做到这一点吗?类似于布尔表达式的串联?

【问题讨论】:

    标签: javascript arrays boolean-expression


    【解决方案1】:

    您可以使用indexOf 方法检查给定array 中是否存在item

    indexOf 方法返回指定值的第一次出现,如果没有找到value,则返回-1

    var toBeFiltered = [
      {name:"A", parentId: 0},
      {name: "B", parentId: 3},
      {name: "C", parentId: 0},
      {name: "D", parentId: 1},
      {name: "E", parentId: 4}
    ]
    var filtering = [3,1,0];
    toBeFiltered=toBeFiltered.filter(a=>filtering.indexOf(a.parentId)!==-1);
    console.log(toBeFiltered);

    您还可以使用ES6 中的Set 功能。

    var toBeFiltered = [
      {name:"A", parentId: 0},
      {name: "B", parentId: 3},
      {name: "C", parentId: 0},
      {name: "D", parentId: 1},
      {name: "E", parentId: 4}
    ]
    var filtering = new Set([3,1,0]);
    toBeFiltered=toBeFiltered.filter(a=>filtering.has(a.parentId));
    console.log(toBeFiltered);

    【讨论】:

    • 简洁优雅。我没有想过这个。谢谢。
    【解决方案2】:

    你可以拿Array#includes

    var toBeFiltered = [{ name:"A", parentId: 0 }, { name: "B", parentId: 3 }, { name: "C", parentId: 0 }, { name: "D", parentId: 1 }],
        filtering = [1, 0], // to prevent to get the same array as the original
        result = toBeFiltered.filter(o => filtering.includes(o.parentId));
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 谢谢。我接受了另一个答案,因为包含的支持不如 indexOf。
    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 2012-02-17
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多