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
filtering an array of objects based on another array in javascript
提问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
回答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()方法时得到的时间复杂度相反,其中N是people数组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 );

