简体   繁体   中英

Javascript: filter array of objects by array of strings

I wonder if there is a more elegant way of doing this. Suppose i have an array of objects like this:

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
  }
]

Now i want to filter on the id property, to return all objects with a match in another array

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

I came up with this solution:

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

Coming from R, this seems a bit complicated, is there any way to do that with the filter prototype? Like this but with an array of strings to compare with instead of a single string:

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

Thanks a lot!

You can use indexOf in filter, like this

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

Example

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

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

Just make use of Array.indexOf

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

Array.indexOf returns the index of the argument passed in the array on which indexOf is being called on. It returns -1 if there isn't the element which we are looking for.

So, we make sure that it index is greater than -1

If you want them in the order of the array of string then

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM