简体   繁体   English

根据值列表过滤对象数组

[英]filter array of objects based on list of values

I have an array as following我有一个数组如下

array = [
{
  name: 'A'
  instructors: [
   {
     name:'InsA'
   }
  ]
  businessUnit: {name:'myBusiness'}
},
{
  name: 'B'
  instructors: [
   {
     name:'InsB'
   }
  ]
  businessUnit: {name:'myBusinessB'}
}

]

I want to filter this array with the values i have which are also in an array as following我想用我拥有的值过滤这个数组,这些值也在一个数组中,如下所示

nameArr = [A,C,D]
instructorArr = [InsA,InsC,InsZ]
businessName = [myBusinessB,myBusinessX,myBusinessD]

If can filter this array if i have to check with just one value as following如果我只需要检查一个值,是否可以过滤此数组,如下所示

const filtered = _.filter(groupActivityList, (obj) => {
      return (
        obj.name === (groupClassFilter !== defaultFilter ? groupClassFilter : obj.name) &&
        obj.instructors.length > 0 &&
        obj.instructors[0]?.name ===
          (groupInstructorFilter !== defaultFilter
            ? groupInstructorFilter
            : obj.instructors.length > 0 && obj.instructors[0]?.name) &&
        obj.businessUnit.name ===
          (groupFacilityFilter !== defaultFilter ? groupFacilityFilter : obj.businessUnit.name)
      );
    });

How do i filter when i have a set of values to filter with Ex: nameArr = [A,C,D]当我有一组值要过滤时,我如何过滤 Ex: nameArr = [A,C,D]

An example for filtering the array using Array.prototype.some and Array.prototype.includes :使用Array.prototype.someArray.prototype.includes过滤数组的示例:

 const array = [{ name: 'A', instructors: [{ name: 'InsA' }], businessUnit: { name: 'myBusinessA' } }, { name: 'B', instructors: [{ name: 'InsB' }], businessUnit: { name: 'myBusinessB' } }, { name: 'Z', instructors: [{ name: 'InsZZ' }], businessUnit: { name: 'myBusinessZZ' } } ]; const nameArr = ['A', 'C', 'D'] const instructorArr = ['InsA', 'InsC', 'InsZ'] const businessName = ['myBusinessB', 'myBusinessX', 'myBusinessD', 'myBusinessA'] const filtered = array.filter(el => nameArr.includes(el.name) && el.instructors.some(ins => instructorArr.some(iA => ins.name === iA)) && businessName.includes(el.businessUnit.name) ); console.log(filtered);

You can use the Array#some property, if I understand the question correctly.如果我正确理解问题,您可以使用Array#some属性。

Instead of checking obj.name === filterObj.name , you can check with fiterObj.names.some(name => name === obj.name) which will return true if any of the elements inside the namesArr matches the object's name代替检查obj.name === filterObj.name ,您可以使用fiterObj.names.some(name => name === obj.name)进行检查,如果namesArr中的任何元素与对象的名称匹配,它将返回 true

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM