JavaScript: 使用字符串数组过滤对象数组

16

我在想是否有更优雅的方法来做这件事。假设我有一个像这样的对象数组:

a = [
  {
    "id": "kpi02",
    "value": 10
  },
  {
    "id": "kpi02",
    "value": 30
  },
  {
    "id": "kpi02",
    "value": 11
  },
  {
    "id": "kpi02",
    "value": 33
  },
  {
    "id": "kpi03",
    "value": 1
  },
  {
    "id": "kpi03",
    "value": 0.5
  },
  {
    "id": "kpi04",
    "value": 0.5
  }
]

现在我想根据 id 属性进行过滤,以返回在另一个数组中存在匹配的所有对象

var kpis = ["kpi03", "kpi02"];

我想出了这个解决方案:

var b = [];
for (j in kpis) {
 for (i in a) { 
    if (a[i].id == kpis[j]) {
    b.push(a[i]);
    }
 }
}

从 R 过来,这似乎有点复杂,是否有使用 filter 原型的方法可以实现?就像这样,但是使用字符串数组进行比较而不是单个字符串:

 var b = a.filter( function(item){return (item.id == "kpi03");} );

非常感谢!

4个回答

22

您可以在filter中使用indexOf,像这样:

var res = a.filter(function (el) {
  return kpis.indexOf(el.id) >= 0; 
});

示例


1
谢谢你的快速回答和示例!我知道肯定有更优雅的解决方案 :) - Schw4rz

14

另一个不错的选择是使用 .filter.includes:

var result = a.filter(item => kpis.includes(item.id))

3
如果您希望按照字符串数组的顺序排列它们,则
    var result = [];
kpis.map((item) => {
    const matchedObject = a.find(
        (option) => option.id === item
    );
    result.push(matchedObject);
});

2

只需使用 Array.indexOf 即可。

var b = a.filter(function(item){return kpids.indexOf(item.id) > -1 });
Array.indexOf 返回在调用 indexOf 方法的数组中传递的参数的索引。如果我们要查找的元素不存在,它将返回 -1
因此,我们确保它的索引大于-1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接