J'ai un tableau d'objets avec la structure suivante:
// Approach I have tried so far: var results = arr.filter(function(entry) { return entry.show === false; });
Je veux que la sortie soit deux tableaux, un pour show: true
et l'autre pour show: false
, c'est-à-dire basé sur la valeur de la propriété show
. Idéalement, une seule fonction qui me donne les deux tableaux serait géniale. J'attends la prochaine sortie:
arr1 = ["abc", "pqr"] arr2 = ["xyz", "lmn"]
Mon approche actuelle est:
let arr = [ {name: "abc", show: true , display:"ABC"}, {name: "xyz", show: false , display:"XYZ"}, {name: "pqr", show: true , display:"PQR"}, {name: "lmn", show: false , display:"LMN"} ]
Mais cela me donne un tableau d'objets , et à la place je veux un tableau avec des noms
. Quelqu'un peut-il m'aider?
5 Réponses :
Essayez ceci:
let arr = [ {name: "abc", show: true , display:"ABC"}, {name: "xyz", show: false , display:"XYZ"}, {name: "pqr", show: true , display:"PQR"}, {name: "lmn", show: false , display:"LMN"} ] const match = (bool) => arr.filter(res => res.show === bool).map(ele => ele.name); console.log(match(true)); console.log(match(false));
ForEach
chaque objet, puis vérifiez la propriété show. Si show == true
alors poussez le contenu vers un tableau, sinon vers un autre tableau
let arr = [{name: "abc",show: true,display: "ABC"},{name: "xyz",show: false,display: "XYZ"},{name: "pqr",show: true,display: "PQR"},{name: "lmn",show: false,display: "LMN"}] let arr1 = arr.map((val,intt) => { if (val.show) return val.name }).filter(n => n) let arr2 = arr.map((val,intt) => { if (!val.show) return val.name }).filter(n => n) console.log(arr1); console.log(arr2)
En utilisant .map
, vous pouvez le faire en renvoyant un tableau comme
let arr = [{name: "abc",show: true,display: "ABC"},{name: "xyz",show: false,display: "XYZ"},{name: "pqr",show: true,display: "PQR"},{name: "lmn",show: false,display: "LMN"}] let arr1 = [], arr2 = []; arr.forEach((val, intt) => { if (val.show) { arr1.push(val.name) } else { arr2.push(val.name) } }) console.log(arr1); console.log(arr2);
C'est la même chose. Dans la première fonction, nous renvoyons uniquement les valeurs qui ont show == true
et la seconde fermeture renvoie le contraire. Nous utilisons array.filter (n => n)
pour filtrer les valeurs vides
Vous pouvez utiliser .reduce
pour créer un tableau multidimensionnel, puis pousser le nom
dans l'index 0
si show est false
et poussez dans l'index 1
si show est true
comme ceci:
let arr = [ {name: "abc", show: true , display:"ABC"}, {name: "xyz", show: false , display:"XYZ"}, {name: "pqr", show: true , display:"PQR"}, {name: "lmn", show: false , display:"LMN"} ]; let [arr2, arr1] = arr.reduce( (acc, {name, show}) => (acc[+show].push(name), acc), [[], []]); console.log(arr1); // ["abc", "pqr"] console.log(arr2); // ["xyz", "lmn"]
Solution très agréable (et intelligente)!
Une solution possible pour résoudre ce problème consiste à utiliser Array.reduce () pour générer un objet avec les tableaux souhaités, vous pourrez ensuite accéder à ces tableaux ultérieurement.
.as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;}
let arr = [ {name: "abc", show: true , display:"ABC"}, {name: "xyz", show: false , display:"XYZ"}, {name: "pqr", show: true , display:"PQR"}, {name: "lmn", show: false , display:"LMN"} ]; var res = arr.reduce((acc, {show, name}) => { if (show) acc.show.push(name); else acc.noShow.push(name); return acc; }, {show:[], noShow:[]}); console.log("show => true", res.show); console.log("show => false", res.noShow);
L'utilisation d'une bibliothèque comme Ramda.js rend les solutions simples et courtes
<script src="//cdn.jsdelivr.net/npm/ramda@latest/dist/ramda.min.js"></script>
const arr = [ {name: "abc", show: true , display:"ABC"}, {name: "xyz", show: false , display:"XYZ"}, {name: "pqr", show: true , display:"PQR"}, {name: "lmn", show: false , display:"LMN"} ] const f = R.pipe( R.partition(R.prop("show")), R.map(R.pluck("name")) ) console.log(f(arr))