0

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 } 
           
        ] } 
      
  ] } ] 

6
  • Please add the expected output for the example you have given. Commented Jan 28, 2022 at 17:35
  • Please provide/show the expected outcome. It is unclear from your question what you expect to see as the result. Commented Jan 28, 2022 at 17:35
  • Does this answer your question? Filter nested array in object array by array of values Commented Jan 28, 2022 at 17:40
  • Welcome. Please see How to Ask and take the tour. Commented Jan 28, 2022 at 17:41
  • @pilchard, that question is not really about an arbitrarily deeply nested structure. Maybe there is a better dupe match. Commented Jan 28, 2022 at 17:42

1 Answer 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; }

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.