Home > OS >  Intersection of two arrays in javascript
Intersection of two arrays in javascript

Time:04-16

I want to search in a big array for different id from another array and print all intersections of those two arrays

I want to map through my bigTable and I want to create another array of correspondence, each found element must contain all fields tableName tableID like this :

const output = [{
    ID: 1234,
    title: 'title1',
    TableName: 'loramIpsum',
    TableId: 11,
  },
  {
    ID: 98523,
    title: 'mylasttitle',
    TableName: 'table2',
    TableId: 87545,
  },
  {
    ID: 97766,
    title: 'mylastdata',
    TableName: 'table2',
    TableId: 87545,
  },
]

I've create a function but I think there is another best and sample solution, this is my function :

const getResult = (wantedData, bigArray) => {
  return wantedData.flatMap((id) =>
    bigArray.flatMap((family) =>
      family.Tables.flatMap((table) => {
        let item = table.myDatas.find((el) => el.ID === id);
        if (item) {
          item.Table = table.TableName;
          item.familyId = family.GridId;
          return item;
        }
      }).filter((result) => result !== undefined)
    )
  );
};
console.log(getResult(wantedData, bigArray))
<script>
  const wantedData = [1235, 98523, 97766];


  const bigArray = [{
      bigArrayId: 1111,
      Tables: [{
        TableId: 11,
        TableName: 'loramIpsum',
        myDatas: [{
            ID: 1234,
            title: 'title1',
          },
          {
            ID: 1235,
            title: 'title2',
          },
        ],
      }, ],
    },
    {
      bigArrayId: 674665,
      Tables: [{
        TableId: 87545,
        TableName: 'table2',
        myDatas: [{
            ID: 98523,
            title: 'mylasttitle',
          },
          {
            ID: 24134,
            title: 'alex',
          },
          {
            ID: 97766,
            title: 'mylastdata',
          },
        ],
      }, ],
    },
  ];
</script>

Any help please ? Can I do it with recursive function ?

CodePudding user response:

I think you need to solve this problem in two steps:

  • First, create a flat array of tables
  • Then filter the array by conditions

const bigArray=[{bigArrayId:1111,Tables:[{TableId:11,TableName:"loramIpsum",myDatas:[{ID:1234,title:"title1"},{ID:1235,title:"title2"}]}]},{bigArrayId:674665,Tables:[{TableId:87545,TableName:"table2",myDatas:[{ID:98523,title:"mylasttitle"},{ID:24134,title:"alex"},{ID:97766,title:"mylastdata"}]}]}];

const wantedData = [1235, 98523, 97766];

const flatTables = bigArray.flatMap(({ Tables }) => 
  Tables.flatMap(({ myDatas, TableId, TableName }) => 
    myDatas.map((data) => ({ ...data, TableId, TableName })) ));

const result = flatTables.filter(({ ID }) => wantedData.includes(ID));

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

CodePudding user response:

I think if you do it something like this you'll be able to map after you've found the right things rather than mapping everything and then filtering that result:

const bigArray = [{ bigArrayId: 1111, Tables: [{ TableId: 11, TableName: 'loramIpsum', myDatas: [{ ID: 1234, title: 'title1', }, { ID: 1235, title: 'title2', }, ], }, ], }, { bigArrayId: 674665, Tables: [{ TableId: 87545, TableName: 'table2', myDatas: [{ ID: 98523, title: 'mylasttitle', }, { ID: 24134, title: 'alex', }, { ID: 97766, title: 'mylastdata', }, ], }, ], }, ];

const wantedData = [1235, 98523, 97766];

const wanted_set = new Set(wantedData);

const push_concat = (arr1, arr2) => {
  for(let i = 0; i < arr2.length; i  )
    arr1.push(arr2[i]);
  
  return arr1;
};

const res = bigArray.reduce(
  (acc, { Tables }) =>
    push_concat(acc, 
      Tables.flatMap(({ TableId, TableName, myDatas }) =>
        myDatas
            .filter(({ ID }) => wanted_set.has(ID))
            .map(({ ID, title }) => ({ ID, title, TableId, TableName }))
      )
    ),
  []
);


console.log(res);

  • Related