-3
const items = [[{name:"p2"},{name:"p3"}, {name:"p7"},{name:"p9"},{name:"p1"}],[{name:"p6"}, {name:"p3"},{name:"p7"}, {name:"p9"},{name:"p2"}],[{name:"p3"},{name:"p6"}, {name:"p7"},{name:"p9"},{name:"p4"}],[{name:"p2"}, {name:"p3"},{name:"p1"}, {name:"p9"},{name:"p6"}]]

const findObj = [{name:"p1"},{name:"p2"},{name:"p6"}]

Find the child array of sets which have all three element from findobj object

  • or [Filter array of objects based on another array in javascript](https://stackoverflow.com/questions/46894352/filter-array-of-objects-based-on-another-array-in-javascript) – pilchard Dec 12 '21 at 16:02

3 Answers3

1

You can easily achieve the result using filter, Set and reduceas:

const items = [
  [
    { name: "p2" },
    { name: "p3" },
    { name: "p7" },
    { name: "p9" },
    { name: "p1" },
  ],
  [
    { name: "p6" },
    { name: "p3" },
    { name: "p7" },
    { name: "p9" },
    { name: "p2" },
  ],
  [
    { name: "p3" },
    { name: "p6" },
    { name: "p7" },
    { name: "p9" },
    { name: "p4" },
  ],
  [
    { name: "p2" },
    { name: "p3" },
    { name: "p1" },
    { name: "p9" },
    { name: "p6" },
  ],
];
const findObj = [{ name: "p1" }, { name: "p2" }, { name: "p6" }];
const set = new Set(findObj.map((o) => o.name));

const result = items.filter((arr) => {
  const remain = arr.reduce((acc, curr) => {
    if (set.has(curr.name)) acc.add(curr.name);
    return acc;
  }, new Set());
  return remain.size === set.size;
});
console.log(result);
DecPK
  • 24,537
  • 6
  • 26
  • 42
1

const items = [[{name:"p2"},{name:"p3"}, {name:"p7"},{name:"p9"},{name:"p1"}],[{name:"p6"}, {name:"p3"},{name:"p7"}, {name:"p9"},{name:"p2"}],[{name:"p3"},{name:"p6"}, {name:"p7"},{name:"p9"},{name:"p4"}],[{name:"p2"}, {name:"p3"},{name:"p1"}, {name:"p9"},{name:"p6"}]]

const findObj = [{name:"p1"},{name:"p2"},{name:"p6"}]


const result = items.filter(item=>{
  const childItem = item.map(childItem=>childItem.name);
  let allExist=true;
  findObj.forEach(obj=>{
  if(!childItem.includes(obj.name)){
  allExist=false;
  }
  })
  return allExist;
})
console.log(result)
abhishek sahu
  • 648
  • 4
  • 8
0

Using filter and get all names from each item by using map .map(prop=>prop.name) or more simple with destructuring .map(({name})=>name) and filter items that names are included in findObj

const items = [[{name:"p2"},{name:"p3"}, {name:"p7"},{name:"p9"},{name:"p1"}],[{name:"p6"}, {name:"p3"},{name:"p7"}, {name:"p9"},{name:"p2"}],[{name:"p3"},{name:"p6"}, {name:"p7"},{name:"p9"},{name:"p4"}],[{name:"p2"}, {name:"p3"},{name:"p1"}, {name:"p9"},{name:"p6"}]]

const findObj = [{name:"p1"},{name:"p2"},{name:"p6"}]
const result = items.filter(item=>{
    const arrProp  = item.map(prop=>prop.name)
    const filtProp = findObj.map(({name})=>name)
    return filtProp.every(x=>arrProp.includes(x));
})
console.log(result)
XMehdi01
  • 5,538
  • 2
  • 10
  • 34