简体   繁体   中英

How to return the matching results from Array of object based on an array of input values

I have an array of objects like below

var item = [
    { "name": "John", "age": 30, "city": "New York1" },
    { "name": "John1", "age": 31, "city": "New York2" },
    { "name": "John2", "age": 32, "city": "New York3" },
    { "name": "John3", "age": 31, "city": "New York3" }
]

What I want is to get some of the age from this array of objects which has age property value in [30,31]

So basically the input will be an array of integers like var ageArray=[30,31];

Example :

Input : [30,31]

Output : Sum of the age of the below objects

 { "name":"John", "age":30, "city":"New York1"},
 { "name":"John1", "age":31, "city":"New York2"},
 { "name":"John3", "age":31, "city":"New York3"}

So here it will be

92

I have tried to use filter for this but not sure how can i use filter with contains

What I have tried is

var result = item .filter(obj => {
                    return obj.age..includes(ages);
                })

Can someone help me to resolve this ?

Use Array#reduce

 const items = [ { "name":"John", "age":30, "city":"New York1"}, { "name":"John1", "age":31, "city":"New York2"}, { "name":"John2", "age":32, "city":"New York3"}, { "name":"John3", "age":31, "city":"New York3"}] const ages = [30, 31]; const res = items.reduce((sum, {age})=>{ return sum + (ages.includes(age) ? age : 0); }, 0); console.log(res); 

Modified for names:

 const items = [ { "name":"John", "age":30, "city":"New York1"}, { "name":"John1", "age":31, "city":"New York2"}, { "name":"John2", "age":32, "city":"New York3"}, { "name":"John3", "age":31, "city":"New York3"}] const names = ["John", "john1"].map(n=>n.toLowerCase()); const res = items.reduce((sum, {name, age})=>{ return sum + (names.includes(name.toLowerCase()) ? age : 0); }, 0); console.log(res); 

You can do it with reduce

 var item= [{ "name":"John", "age":30, "city":"New York1"},{ "name":"John1", "age":31, "city":"New York2"},{ "name":"John2", "age":32, "city":"New York3"},{ "name":"John3", "age":31, "city":"New York3"}] var ageArray=[30,31]; let op = item.reduce((o,c)=>{ if( ageArray.includes(c.age) ) { o+=c.age } return o; },0) console.log(op) 

You could use three steps

  1. get only the ages
  2. filter the ages with a Set
  3. add remaining values

 var items = [{ name: "John", age: 30, city:" New York1" }, { name: "John1", age: 31, city: "New York2" }, { name: "John2", age: 32, city: "New York3" }, { name: "John3", age: 31, city: "New York3" }], ageArray = [30, 31], result = items .map(({ age }) => age) .filter(Set.prototype.has, new Set(ageArray)) .reduce((a, b) => a + b, 0); console.log(result); 

A slightly different approach for different keys to filter and to add.

 var items = [{ name: "John", age: 30, city:" New York1" }, { name: "John1", age: 31, city: "New York2" }, { name: "John2", age: 32, city: "New York3" }, { name: "John3", age: 31, city: "New York3" }], names = ['John', 'John2'], result = items .filter((s => ({ name }) => s.has(name))(new Set(names))) .map(({ age }) => age) .reduce((a, b) => a + b, 0); console.log(result); 

You can use reduce to do this in one line:

 const item = [{name:"John",age:30,city:"New York1"},{name:"John1",age:31,city:"New York2"},{name:"John2",age:32,city:"New York3"},{name:"John3",age:31,city:"New York3"}] ,ageArray = [30,31] ,total = item.reduce((sum, {age})=> sum += ageArray.includes(age) ? age : 0, 0); console.log(total) 

const items = [
   { "name":"John", "age":30, "city":"New York1"},
   { "name":"John1", "age":31, "city":"New York2"},
   { "name":"John2", "age":32, "city":"New York3"},
   { "name":"John3", "age":31, "city":"New York3"}
];
const ages = [30,31];
const result = items.filter(o => ages.find(o2 => o.age === o2)).map(o3 => o3.age);
console.log(result)
const reducer = (accumulator, currentValue) => accumulator + currentValue;
console.log(result.reduce(reducer))

  function getSum(total, { age }) { if(age===30 ||age===31) return total + age return total } var item = [ { "name": "John", "age": 30, "city": "New York1" }, { "name": "John1", "age": 31, "city": "New York2" }, { "name": "John2", "age": 32, "city": "New York3" }, { "name": "John3", "age": 31, "city": "New York3" } ]; let sumItem = item.reduce(getSum,0) console.log(sumItem); 

you can do it with filter and reduce ##

  • first you need to filter the array
  • and then reduce the array to get sum of 30,31,31

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