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
}];
6 réponses
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);
Dans le cas où vous souhaitez l'exécuter dans la complexité n
, voici une façon de le faire:
- Créez une carte avec clé comme nom de personne et valeur comme objet de personne.
- 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.
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)
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))
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; }
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>