'Search in multi dimension Array in JAVASCRIPT [closed]

I have this array with two object, and I have another array with these IDs: [9054,9021,9040,8941,8947]. I want to filter the big array and get a new array with only matched IDs on the second array.

The problem is to get the same configuration of the array, I want just to delete the unmatched IDs. Any idea how to solve it?

const data = 
  [ { key: 9054, title: '22', children: 
      [ { key: 8959, title: 'ABR_ADRESSE', idFather: 8959, tableIsFamily: false, children: [] } 
      , { key: 8943, title: 'ABR_CONTACT', idFather: 8943, tableIsFamily: false, children: [] } 
      , { key: 9021, title: 'ABR_POSTE',   idFather: 9021, tableIsFamily: false, children: [] } 
      , { key: 8969, title: 'ABR_SOCIETE', idFather: 8969, tableIsFamily: false, children: [] } 
    ] } 
  , { key: 9040, title: '33', children: 
      [ { key: 8957, title: 'THB_Adresse_Famille', idFather: 8957, tableIsFamily: false, children: [] } 
      , { key: 8941, title: 'THB_Contact_Famille', idFather: 8941, tableIsFamily: false, children: 
          [ { key: 8947, title: 'THB_Contact_Table',     idFather: 8941 } 
          , { key: 9855, title: 'THB_Contact_Table_BIS', idFather: 8941 } 
        ] } 
      , { key: 8949,  title: 'THB_Societe_Famille', idFather: 8949,  tableIsFamily: false, children: [] } 
      , { key: 8983,  title: 'THB_TELEPHONE',       idFather: 8983,  tableIsFamily: false, children: [] } 
      , { key: 10070, title: 'THB_TEST_5708',       idFather: 10070, tableIsFamily: false, children: [] } 
  ] } ] 

The expected Output should be :

const data = 
  [ { key: 9054, title: '22', children: 
      [ 
      , { key: 9021, title: 'ABR_POSTE',   idFather: 9021, tableIsFamily: false, children: [] } 
      
    ] } 
  , { key: 9040, title: '33', children: 
      [ 
      , { key: 8941, title: 'THB_Contact_Famille', idFather: 8941, tableIsFamily: false, children: 
          [ { key: 8947, title: 'THB_Contact_Table',     idFather: 8941 } 
           
        ] } 
      
  ] } ] 


Solution 1:[1]

Is this your expected output?

[
  {"key": 9054,"title": "22","children": [
    {"key": 9021,"title": "ABR_POSTE","idFather": 9021,"tableIsFamily": false,"children": []}
  ]},
  {"key": 9040,"title": "33","children": [
    {"key": 8941,"title": "THB_Contact_Famille","idFather": 8941,"tableIsFamily": false,"children": [
      {"key": 8947,"title": "THB_Contact_Table","idFather": 8941}
    ]}
  ]}
]

You will need to loop over each child and recursively filter the children and check if the sub-child key exists within the keys array.

const
  data = [
    {"key":9054,"title":"22","children":[
      {"key":8959,"title":"ABR_ADRESSE","idFather":8959,"tableIsFamily":false,"children":[]},
      {"key":8943,"title":"ABR_CONTACT","idFather":8943,"tableIsFamily":false,"children":[]},
      {"key":9021,"title":"ABR_POSTE","idFather":9021,"tableIsFamily":false,"children":[]},
      {"key":8969,"title":"ABR_SOCIETE","idFather":8969,"tableIsFamily":false,"children":[]}]},
      {"key":9040,"title":"33","children":[
        {"key":8957,"title":"THB_Adresse_Famille","idFather":8957,"tableIsFamily":false,"children":[]},   
        {"key":8941,"title":"THB_Contact_Famille","idFather":8941,"tableIsFamily":false,"children":[
          {"key":8947,"title":"THB_Contact_Table","idFather":8941},
          {"key":9855,"title":"THB_Contact_Table_BIS","idFather":8941}
        ]},
        {"key":8949,"title":"THB_Societe_Famille","idFather":8949,"tableIsFamily":false,"children":[]},
        {"key":8983,"title":"THB_TELEPHONE","idFather":8983,"tableIsFamily":false,"children":[]},
        {"key":10070,"title":"THB_TEST_5708","idFather":10070,"tableIsFamily":false,"children":[]}
      ]}
    ];

// Based on: https://stackoverflow.com/a/41312330/1762224
// For an in-place delete, see: https://stackoverflow.com/a/41312346/1762224
const filterTreeList = (data, opts) =>
  data.filter(item => {
    if (item[opts.childrenKey]) {
      item[opts.childrenKey] = filterTreeList(item[opts.childrenKey], opts);
    }
    return opts.keys.includes(item[opts.itemKey]);
  });

const result = filterTreeList(data, {
  itemKey: 'key',
  childrenKey: 'children',
  keys: [9054, 9021, 9040, 8941, 8947]
});

console.log(result);
.as-console-wrapper { top: 0; max-height: 100% !important; }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mr. Polywhirl