Nous avons un tableau d'objets comme:

const persons = [{
    name: "john",
    age: 23
}, {
    name: "lisa",
    age: 43
}, {
    name: "jim",
    age: 101
}, {
    name: "bob",
    age: 67
}];

Et un tableau de valeurs d'attribut des objets dans l'objet

const names = ["lisa", "bob"]

Comment pouvons-nous trouver des personnes avec un nom dans le tableau des noms en utilisant es6, comme:

const filteredPersons = [{
    name: "lisa",
    age: 43
}, {
    name: "bob",
    age: 67
}];
4
kallada 17 avril 2018 à 09:49

6 réponses

Meilleure réponse

ES6

Utilisez la fonction filter avec un prédicat et vérifiez-y l'existence du nom dans le tableau names.

const persons = [
    {name: "john", age:23},
    {name: "lisa", age:43},
    {name: "jim", age:101},
    {name: "bob", age:67}
];

const names = ["lisa", "bob"];

const filtered = persons.filter(person => names.includes(person.name));

console.log(filtered);
4
Suren Srapyan 17 avril 2018 à 06:50

Dans le cas où vous souhaitez l'exécuter dans la complexité n, voici une façon de le faire:

  1. Créez une carte avec clé comme nom de personne et valeur comme objet de personne.
  2. Mappez le tableau de critères et extrayez les objets personne de la carte créée à l'étape 1.

Voici une démo fonctionnelle:

const persons = [{
  name: "john",
  age: 23
}, {
  name: "lisa",
  age: 43
}, {
  name: "jim",
  age: 101
}, {
  name: "bob",
  age: 67
}];

const names = ["lisa", "bob"];
const map = persons.reduce((acc, item) => {
  acc[item.name] = item;
  return acc;
}, {});
const result = names.map(name => map[name]);
console.log(result);

Remarque: Cette solution suppose que seuls les noms de personne uniques se trouvent dans le tableau source. Il doit être modifié pour gérer les doublons.

1
31piy 17 avril 2018 à 07:10

Voir Closures, Set, et Array.prototype.filter() pour plus d'informations.

// Input.
const persons = [{name: "john",age: 23}, {name: "lisa",age: 43}, {name: "jim",age: 101}, {name: "bob",age: 67}]
const names = ["lisa", "bob"]

// Filter.
const filter = (A, B) => (s => A.filter(x => s.has(x.name)))(new Set(B))

// Output.
const output = filter(persons, names)

// Proof.
console.log(output)
1
Arman Charan 17 avril 2018 à 07:20

Je suggère d'utiliser indexOf car includes ne fonctionne pas dans le navigateur IE. En outre, l'utilisation de {name} fonctionne comme une affectation de destruction qui contiendra la valeur de la propriété name de l'objet.

const persons = [{
  name: "john",
  age: 23
}, {
  name: "lisa",
  age: 43
}, {
  name: "jim",
  age: 101
}, {
  name: "bob",
  age: 67
}];
const names = ["lisa", "bob"];

console.log(persons.filter(({name}) => names.indexOf(name) !== -1))
3
Ankit Agarwal 17 avril 2018 à 07:11

Vous pouvez utiliser filter() et inlcudes() pour obtenir le résultat souhaité.

DEMO

const persons = [{
  name: "john",
  age: 23
}, {
  name: "lisa",
  age: 43
}, {
  name: "jim",
  age: 101
}, {
  name: "bob",
  age: 67
}];
const names = ["lisa", "bob"];

console.log(persons.filter(({
  name
}) => names.includes(name)))
.as-console-wrapper { max-height: 100% !important; top: 0; }
3
Narendra Jadhav 17 avril 2018 à 07:00

lodash

Vous pouvez essayer de suivre

const persons = [{name: "john", age: 23},
    {name: "lisa",age: 43}, 
    {name: "jim", age: 101}, 
    {name: "bob",age: 67}];


const names = ["lisa", "bob"]


const filteredPersons = _.filter(persons, function(person) {
    return _.indexOf(names, person.name) !== -1;
});

console.log(filteredPersons);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>
1
Nikhil Aggarwal 17 avril 2018 à 07:06