0
votes

Filtrer le tableau javascript avec les enfants du sous-tableau et renvoyer le parent

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


0 commentaires

3 Réponses :


1
votes

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 enfants code> contient un résultat, construisez un nouvel objet avec la propriété des enfants mis à jour . p>

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


0 commentaires

2
votes

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.


3 commentaires

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.



0
votes

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


0 commentaires