javascript 根据javascript中的另一个数组过滤对象数组

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/46894352/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 07:01:01  来源:igfitidea点击:

filtering an array of objects based on another array in javascript

javascriptarraysfilter

提问by ios_star

I have an array of objects

我有一个对象数组

people = [
    {id: "1", name: "abc", gender: "m", age:"15" },
    {id: "2", name: "a", gender: "m", age:"25" },
    {id: "3", name: "efg", gender: "f", age:"5" },
    {id: "4", name: "hjk", gender: "m", age:"35" },
    {id: "5", name: "ikly", gender: "m", age:"41" },
    {id: "6", name: "ert", gender: "f", age:" 30" },
    {id: "7", name: "qwe", gender: "f", age:" 31" },
    {id: "8", name: "bdd", gender: "m", age:" 78" },
]

I have another array:

我有另一个数组:

id_filter = [1,4,5,8]

I want to filter the array of people if the idmatches the any of the elements in id_filterarray and gender = m

我想人的滤镜阵列,如果id匹配的任何元素的id_filter数组gender = m

How do I do this in javascript using filter function ?

如何使用过滤器功能在 javascript 中执行此操作?

回答by Sajeetharan

You can use array.filter()with few conditions to get the output you want. Also i have corrected your JSON.

您可以使用array.filter()很少的条件来获得所需的输出。我也更正了你的 JSON。

var filtered = people.filter(function(item) {
        return id_filter.indexOf(item.id) !== -1 && item.gender==='m';
});

DEMO

演示

var  people =[
  { "id": 1, "name": "abc", "gender": "m","age": "15" },
  { "id": 2, "name": "a", "gender": "m", "age": "25"  },
  { "id": 3,"name": "efg", "gender": "f","age": "5" },
  { "id": 4,"name": "hjk","gender": "m","age": "35" },
  {  "id": 5, "name": "ikly","gender": "m","age": "41" },
  { "id": 6, "name": "ert", "gender": "f", "age": "30" },
  { "id": 7, "name": "qwe", "gender": "f", "age": "31" },
  { "id":8, "name": "bdd",  "gender": "m", "age": " 8" }
];
var id_filter = [1,4,5,8];
var filtered = people.filter(function(item) {
    return id_filter.indexOf(item.id) !== -1 && item.gender==='m';
});
console.log(filtered);

回答by Joe Sasson

The simplest way to filter is to use the javascript filterfunction, similar to this:

最简单的过滤方式是使用javascript过滤功能,类似这样:

people.filter((person) => id_filter.includes(person.id))

people.filter((person) => id_filter.includes(person.id))

回答by RomanPerekhrest

With Array.includes()function:

Array.includes()功能:

var people = [
    {id : "1", name : "abc", gender : "m", age :"15" }, {id : "2", name : "a", gender : "m", age :"25" },
    {id : "3", name : "efg", gender : "f", age :"5" },  {id : "4", name : "hjk", gender : "m", age :"35" },
    {id : "5", name : "ikly", gender : "m", age :"41" }, {id : "6", name : "ert", gender : "f", age :" 30" },
    {id : "7", name : "qwe", gender : "f", age :" 31" }, {id : "8", name : "bdd", gender : "m", age :" 78" }
], 
    id_filter = [1,4,5,8],
    result = people.filter((o) => id_filter.includes(+o.id) && o.gender == "m");       
 
console.log(result);



  • +o.id- +is used here to cast a numeric string into number
  • +o.id-+此处用于将数字字符串转换为数字

回答by leox

For this case you can make use of filter and include function, since you id's are string,it need to be parse before use.

对于这种情况,您可以使用 filter 和 include 函数,因为您的 id 是字符串,因此需要在使用前进行解析。

var result = people.filter((person) => (id_filter.includes(parseInt(person.id)) && person.gender ==='m'))

回答by Cleber de Souza Alcantara

You can achieve that by the following code:

您可以通过以下代码实现:

const filtered_people = people.filter(function(person){
    return id_filter.includes(person.id) && person.gender === 'm';
});

Just make sure the id for each person is an integer and not an string, as in your example. Otherwise, the includes() function won't match. Also, your peoplearray has internal syntax problems. So, the final code would look like this:

只需确保每个人的 id 是整数而不是字符串,如您的示例所示。否则,includes() 函数将不匹配。此外,您的people数组有内部语法问题。所以,最终的代码看起来像这样:

const people = [
    {id: 1, name: "abc", gender: "m", age:15},
    {id: 2, name: "a", gender: "m", age: 25},
    {id: 3, name: "efg", gender: "f", age: 5},
    {id: 4, name: "hjk", gender: "f", age: 35},
    {id: 5, name: "ikly", gender: "m", age: 41},
    {id: 6, name: "ert", gender: "f", age: 30},
    {id: 7, name: "qwe", gender: "f", age: 31},
    {id: 8, name: "bdd", gender: "m", age: 78}
]
const id_filter = [1,4,5,8]
const filtered_people = people.filter((person) => id_filter.includes(person.id) && person.gender === 'm')
console.log(filtered_people)

I hope this helps you. Good luck.

我希望这可以帮助你。祝你好运。

回答by ibrahim mahrir

You can use Array.prototype.filterlike:

你可以使用Array.prototype.filter像:

function filter(arr, ids, gender) {                              // takes an array of people arr, an array of indexes ids, and a gender and return the matched people objects from arr
  return arr.filter(function(obj) {                              // filtering each object...
    return ids.includes(obj.id) && obj.gender === gender;        // if this object is is included in the ids array and if its gender property is equal to the desired gender
  });
}

var people = [{id:"1",name:"abc",gender:"m",age:"15"},{id:"2",name:"a",gender:"m",age:"25"},{id:"3",name:"efg",gender:"f",age:"5"},{id:"4",name:"hjk",gender:"m",age:"35"},{id:"5",name:"ikly",gender:"m",age:"41"},{id:"6",name:"ert",gender:"f",age:"30"},{id:"7",name:"qwe",gender:"f",age:"31"},{id:"8",name:"bdd",gender:"m",age:"78"}];

console.log(filter(people, ["5", "7", "4"], "m"));               // filtering elements where id is one of ["5", "7", "4"] and the gender is "m".

Note:The idproperty of the objects in peopleare strings so you have to either provides an array of string ids to filteror convert the idproperty to a number before passing it to includes.

注:id中对象的属性people是字符串,所以你必须要么提供的字符串ID的数组filter或转换id属性将它传递给前一个号码includes

回答by ideaboxer

const people = [
    {id: "1", name: "abc", gender: "m", age: "15" },
    {id: "2", name: "a", gender: "m", age: "25" },
    {id: "3", name: "efg", gender: "f", age: "5" },
    {id: "4", name: "hjk", gender: "m", age: "35" },
    {id: "5", name: "ikly", gender: "m", age: "41" },
    {id: "6", name: "ert", gender: "f", age: " 30" },
    {id: "7", name: "qwe", gender: "f", age: " 31" },
    {id: "8", name: "bdd", gender: "m", age: " 78" },
]

const idFilter = [1,4,5,8]

const idIsInList = id => idFilter.includes(+id) // "+id" to make sure it is a number, not a string
const genderIsMale = gender => gender === "m"
const result = people.filter(item => idIsInList(item.id) && genderIsMale(item.gender))

console.log(result)

回答by inxoy

in this case it makes more sense to do this by foot so first you need to iterate through your peoplearray then you check if a persons id is equal to your filter list

在这种情况下,步行更有意义,因此首先您需要遍历您的people数组,然后检查人员 ID 是否等于您的过滤器列表

for(person in people) {
     for(id in id_filter) {
         if(person[id] == id && person[gender] == "m"){

         }
     }
}

回答by Nick Parsons

If your id_filteris large, you would want to first convert it to a new Set(). This will allow for constant-time lookup. You can then iterate your peoplearray using .filter()and return trueif your set .has()the idin it and if the gender is equal to 'm'.

如果您id_filter的文件很大,您需要先将其转换为new Set(). 这将允许恒定时间查找。然后,您可以people使用迭代您的数组.filter()并返回,true如果您在其中设置.has()id并且性别等于'm'.

const people = [ {id: "1", name: "abc", gender: "m", age:"15" }, {id: "2", name: "a", gender: "m", age:"25" }, {id: "3", name: "efg", gender: "f", age:"5" }, {id: "4", name: "hjk", gender: "m", age:"35" }, {id: "5", name: "ikly", gender: "m", age:"41" }, {id: "6", name: "ert", gender: "f", age:" 30" }, {id: "7", name: "qwe", gender: "f", age:" 31" }, {id: "8", name: "bdd", gender: "m", age:" 78" }, ];

const id_filter = new Set([1,4,5,8]);
const res = people.filter(({id, gender}) => id_filter.has(+id) && gender === 'm');
console.log(res);

Overall, the time complexity for this approach will be O(N)as opposed to the O(Nk)you would get if you were using the .includes()or .indexOf()approach, where Nis the length of the peoplearray, and kis the length of the id_filterarray

总的来说,这种方法的时间复杂度将O(N)O(Nk)使用.includes()or.indexOf()方法时得到的时间复杂度相反,其中Npeople数组k的长度, 是id_filter数组的长度

回答by Nick Timmer

    people = [
        {id : "1", name : "abc", gender : "m", age :"15" },
        {id : "2", name : "a", gender : "m", age :"25" },
        {id : "3", name : "efg", gender : "f", age :"5" },
        {id : "4", name : "hjk", gender : "m", age :"35" },
        {id : "5", name : "ikly", gender : "m", age :"41" },
        {id : "6", name : "ert", gender : "f", age :" 30" },
        {id : "7", name : "qwe", gender : "f", age :" 31" },
        {id : "8", name : "bdd", gender : "m", age :" 78" }
    ]
    var id_filter = ["1","4","5","8"], filteredPeople = []; 
    for( var i=people.length-1; i>=0; --i){ 
      if( id_filter.indexOf( people[i].id ) != -1 ){ 
        filteredPeople.push( people[i] ); 
      } 
    }
    console.log( filteredPeople );