簡體   English   中英

根據 javascript 中的另一個數組過濾對象數組

[英]Filter array of objects based on another array in javascript

給定一個對象數組:

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:

id_filter = [1,4,5,8]

如何過濾數組people以返回id_filtergender=m中定義的目標 id?

最簡單的過濾方法是使用數組的filter() function,類似這樣:

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

您可以在幾個條件下使用array.filter()來獲得您想要的 output。 我還糾正了你的 JSON。

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

演示

 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)

使用Array.includes() function:

 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 - +在這里用於將數字字符串轉換為數字

您可以通過以下代碼實現:

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

只需確保每個人的 id 是 integer 而不是字符串,如您的示例所示。 否則,includes() function 將不匹配。 此外,您的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)

我希望這可以幫助你。 祝你好運。

對於這種情況,您可以使用過濾器並包含 function,因為您的 id 是字符串,因此需要在使用前進行解析。

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

在這種情況下,步行更有意義,因此首先您需要遍歷people數組,然后檢查人員 ID 是否等於您的過濾器列表

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

         }
     }
}

您可以像這樣使用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".

注意: people中對象的id屬性是字符串,因此您必須提供一個字符串 id 數組來filter ,或者在將id屬性傳遞給includes之前將其轉換為數字。

 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)

如果您的id_filter很大,您需要先將其轉換為new Set() 這將允許恆定時間查找。 然后,您可以使用.filter()迭代您的people數組,如果您設置.has()中的id並且性別等於'm' ,則返回true

 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);

總體而言,這種方法的時間復雜度將為O(N + k) ,而不是使用.includes().indexOf()方法時的O(Nk) ,其中Npeople數組, kid_filter數組的長度

 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 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM