Merci d'avance. J'ai le tableau ci-dessous et j'essaie de travailler avec un filtre de tableau en javascript.
const filteredContent = ItemsList.filter(item => { return item.ItemName.indexOf(value) !== -1; });
Si je recherche SomeData 4 , l'utilisation du filtre devrait me renvoyer quelque chose comme
[{ID: 19,ItemName: "SomeData 2", children : [{ID: 41,ItemName: "**SomeData 4**"}]} {ID: 14, ItemName: "**SomeData 4**", children : [{ID: 21,ItemName: "SomeData 9"}]}]
Q1) Que si les mots-clés de recherche correspondent à n'importe quel objet de l'enfant, il doit retourner inclure son contenu parent. Même si cela correspond au parent, il devrait renvoyer le parent et l'enfant. (J'ai terminé avec cette partie)
[{ID: 16,ItemName: "SomeData 1", children : []}, {ID: 19,ItemName: "SomeData 2", children : [{ID: 51,ItemName: "SomeData 3"},{ID: 41,ItemName: "SomeData 4"},{ID: 16,ItemName: "SomeData 5"}]} {ID: 14, ItemName: "SomeData 4", children : [{ID: 21,ItemName: "SomeData 9"}]}]
Est-ce que n'importe qui peut suggérer une meilleure façon d'exécuter Q1
3 Réponses :
Vous pouvez prendre une approche récursive et vérifier que l'objet réel contient la valeur souhaitée ou si les enfants contiennent une valeur recherchée.
si p> enfants code> contient un résultat, construisez un nouvel objet avec la propriété des enfants mis à jour . p>
const
find = (r, o) => {
if (o.ItemName === search) r.push(o);
else {
var children = (o.children || []).reduce(find, []);
if (children.length) r.push(Object.assign({}, o, { children }));
}
return r;
};
var data = [{ ID: 16, ItemName: "SomeData 1", children: [] }, { ID: 19, ItemName: "SomeData 2", children: [{ ID: 51, ItemName: "SomeData 3" }, { ID: 41, ItemName: "SomeData 4" }, { ID: 16, ItemName: "SomeData 5" }] }, { ID: 14, ItemName: "SomeData 4", children: [{ ID: 21, ItemName: "SomeData 9" }] }],
search = 'SomeData 4',
result = data.reduce(find, []);
console.log(result);
Solution modifiée pour nchildren dans un objet et leurs enfants à n itérations. Utilisez la même fonction mais de manière récursive. La fonction ci-dessous fonctionne.
var data = [{ ID: 16,ItemName: "SomeData 1", children: [],children: [{ID: 73,ItemName: "SomeData 3"}, {ID: 57,ItemName: "SomeData 4"}, {ID: 59,ItemName: "SomeData 5"}] }, { ID: 19,ItemName: "SomeData 2", children: [{ID: 51,ItemName: "SomeData 3"}, {ID: 41,ItemName: "SomeData 4"}, {ID: 16,ItemName: "SomeData 5"}] }, { ID: 14,ItemName: "SomeData 4", children: [{ID: 21,ItemName: "SomeData 9"}] } ] const filteredContent = (ItemsList, value) => { return ItemsList.filter(item => { let hasValue = item.ItemName.indexOf(value) !== -1 if (!hasValue) { for (let key in item) { if (key === 'children') { item.children = filteredContent(item.children, value); hasValue = item.children && item.children.length > 0; } } } return hasValue }); } console.log(filteredContent(data, 'SomeData 4'));
J'espère que c'est la solution que vous attendez.
Cette fonction pourrait également être utilisée, si plus d'enfants à l'objet enfants
@ Bankitjayaprakash c'est une meilleure solution que la mienne. Vous pouvez utiliser celui-ci.
@AnkitJayaprakash j'ai modifié la solution pour avoir des nièmes enfants et leurs enfants pour n itérations.
Vous pouvez parcourir votre tableau de manière récursive:
let arr = [ { ID: 16, ItemName: "SomeData 1", children: [] }, { ID: 19, ItemName: "SomeData 2", children: [{ ID: 51, ItemName: "SomeData 3" }, { ID: 41, ItemName: "SomeData 4" }, { ID: 16, ItemName: "SomeData 5" }] }, { ID: 14, ItemName: "SomeData 4", children: [{ ID: 21, ItemName: "SomeData 9" }] }]; let searchResult = []; let wordToFind = 'SomeData 4'; const search = (arr, keyWord) => { arr.forEach(element => { if ((element.ItemName == keyWord && element.children)) { searchResult.push(element); } if ((element.children && element.children.some(s=> s.ItemName == keyWord))) { let newObj = {...element}; newObj.children = newObj.children.filter(f => f.ItemName == keyWord); searchResult.push(newObj); } if ( Array.isArray(element.children) && element.children.length > 0) { search(element.children, keyWord); } }); } search(arr, 'SomeData 4'); console.log(searchResult);
Un exemple:
const search = (arr, keyWord) => { arr.forEach(element => { if ((element.ItemName == keyWord && element.children)) { searchResult.push(element); } if ((element.children && element.children.some(s=> s.ItemName == keyWord))) { let newObj = {...element}; newObj.children = newObj.children.filter(f => f.ItemName == keyWord); searchResult.push(newObj); } if ( Array.isArray(element.children) && element.children.length > 0) { search(element.children, keyWord); } }); }