How to filter array of object values with object of array containing multiple values and make it work with && statement - React

Viewed 24

I am trying to filter an array of object values based on an onther input of array of object

Main array and filter logic looks like bellow ,

let mainArr = [{
  AREA: "INDIA",
  GROUP_DESC: "Group A",
  BUSINESS_ID: "1",
  SUB_REGION: "KARNATAKA"
}, {
  AREA: "INDIA",
  GROUP_DESC: "Group A",
  BUSINESS_ID: "2",
  SUB_REGION: "Tamilnadu"
}, {
  AREA: "INDIA",
  GROUP_DESC: "Group C",
  BUSINESS_ID: "3",
  SUB_REGION: "Kerala"
}, {
  AREA: "AFRICA",
  GROUP_DESC: "Group D",
  BUSINESS_ID: "4",
  SUB_REGION: "Nigeria"
}];

let arrTofilter = {
  AREA: [],
  GROUP_DESC: ['Group A', 'Group D'],
  BUSINESS_ID: ['2'],
  SUB_REGION: []
};

const finalArr = mainArr.filter(({ GROUP_DESC, BUSINESS_ID}) =>
  arrTofilter.GROUP_DESC.includes(GROUP_DESC) && 
  arrTofilter.BUSINESS_ID.includes(BUSINESS_ID));

Above logic works fine. now I need to remove the && statement ( i dont want to do this since in some stage array will get updated and only contain GROUP_DESC without BUSINESS_ID ) ,

something like bellow

let arrTofilter = {AREA: [], GROUP_DESC: ['Group A','Group D'], BUSINESS_ID: [], SUB_REGION: []};

in this example I have less fields but in my project arrTofilter fields are huge , so how can i dynamically add multiple && statements based on input i receive on arrTofilter array or is there any other array functions i can use?

1 Answers

You could use every

const finalArr = mainArr.filter((data) =>
  Object.keys(arrTofilter).every((filteredKey) =>
    arrTofilter[filteredKey].includes(data[filteredKey])
  )
);

let mainArr = [
  {
    AREA: "INDIA",
    GROUP_DESC: "Group A",
    BUSINESS_ID: "1",
    SUB_REGION: "KARNATAKA",
  },
  {
    AREA: "INDIA",
    GROUP_DESC: "Group A",
    BUSINESS_ID: "2",
    SUB_REGION: "Tamilnadu",
  },
  {
    AREA: "INDIA",
    GROUP_DESC: "Group C",
    BUSINESS_ID: "3",
    SUB_REGION: "Kerala",
  },
  {
    AREA: "AFRICA",
    GROUP_DESC: "Group D",
    BUSINESS_ID: "4",
    SUB_REGION: "Nigeria",
  },
];

let arrTofilter = {
  AREA: [],
  GROUP_DESC: ["Group A", "Group D"],
  BUSINESS_ID: ["2"],
  SUB_REGION: [],
};

const finalArr = mainArr.filter((data) =>
  Object.keys(arrTofilter).every((filteredKey) =>
    arrTofilter[filteredKey].includes(data[filteredKey])
  )
);

console.log(finalArr);

Related