Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:按字符串数组过滤对象数组_Javascript_Arrays_Filter - Fatal编程技术网

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

Javascript:按字符串数组过滤对象数组,javascript,arrays,filter,Javascript,Arrays,Filter,我想知道是否有更优雅的方式来做这件事。假设我有这样一个对象数组: a = [ { "id": "kpi02", "value": 10 }, { "id": "kpi02", "value": 30 }, { "id": "kpi02", "value": 11 }, { "id": "kpi02", "value": 33 }, { "id": "kpi03", "value":

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

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,这似乎有点复杂,有没有办法用
过滤器
原型来实现这一点?与此类似,但使用一个字符串数组进行比较,而不是使用单个字符串:

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

您可以在过滤器中使用,如下所示

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

Array.indexOf
返回在调用
indexOf
的数组中传递的参数的索引。如果不存在我们要查找的元素,它将返回
-1


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

另一个不错的替代方法是使用:


如果希望它们按字符串数组的顺序排列,则

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

感谢您的快速回答和示例!我知道一定有更优雅的解决方案:)
var result = a.filter(item => kpis.includes(item.id))
    var result = [];
kpis.map((item) => {
    const matchedObject = a.find(
        (option) => option.id === item
    );
    result.push(matchedObject);
});