4 votes

Comment renvoyer les résultats correspondants d'un tableau d'objets en fonction d'un tableau de valeurs d'entrée ?

J'ai un tableau d'objets comme ci-dessous

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

Ce que je veux, c'est obtenir une partie de l'âge à partir de ce tableau d'objets qui a une valeur de propriété d'âge dans [30,31]

Donc, fondamentalement, l'entrée sera un tableau d'entiers comme var ageArray=[30,31];

Exemple :

Entrée : [30,31]

Sortie : Somme des age des objets ci-dessous

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

Alors voilà

92

J'ai essayé d'utiliser un filtre pour cela mais je ne sais pas comment l'utiliser. filter avec contient

Ce que j'ai essayé est

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

Quelqu'un peut-il m'aider à résoudre ce problème ?

6voto

Grimbode Points 690

Utilisez Tableau#réduire

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

Modifié pour les noms :

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

3voto

Code Maniac Points 29570

Vous pouvez le faire avec réduire le site

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)

3voto

Nina Scholz Points 17120

Vous pourriez utiliser trois étapes

  1. obtenir seulement les âges
  2. filtrer les âges avec un Set
  3. ajouter les valeurs restantes

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

Une approche légèrement différente pour les différentes clés de filtrage et d'ajout.

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

2voto

adiga Points 16410

Vous pouvez utiliser reduce pour faire cela en une seule ligne :

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)

1voto

Mr code. Points 182
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))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X