Javascript:按字符串数组过滤对象数组

时间:2015-01-25 15:38:00

标签: javascript arrays filter

我想知道是否有更优雅的方式来做到这一点。假设我有一个像这样的对象数组:

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 个答案:

答案 0 :(得分:11)

您可以在过滤器中使用indexOf,例如

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

Example

答案 1 :(得分:1)

只需使用Array.indexOf

即可
var b = a.filter(function(item){return kpids.indexOf(item.id) > -1 });

Array.indexOf返回在调用indexOf的数组中传递的参数的索引。如果没有我们正在寻找的元素,它将返回-1

因此,我们确保它的索引大于-1

答案 2 :(得分:1)

如果要按字符串数组的顺序进行操作

    var result = [];
kpis.map((item) => {
    const matchedObject = a.find(
        (option) => option.id === item
    );
    result.push(matchedObject);
});

答案 3 :(得分:0)

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

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