Javascript如何使用filter()内的forEach()过滤数组

时间:2017-07-09 14:17:34

标签: javascript arrays typescript filter

我有一个对象数组,我想根据对象属性值对其进行过滤。我想用不同的属性过滤它,所以它需要是动态的。为此,我有一个输入字段,我键入然后过滤数组。所以,假设我有这两个不同的数组:

const array_one = [
  {id: 1, code: 'ABC123', name: 'John'},
  {id: 2, code: 'DEF456', name: 'Stew'},
    // ...
];

const array_two = [
  {id: 1, value: '012345', company: 'Company 01' },
  {id: 2, value: '678910', company: 'Company 02' },
    // ...
];

我想要一个函数,我可以根据name过滤第一个数组,如果我想过滤第二个数组,我想通过value过滤它。

为此,我建立了这个功能:

filterArray(array: Array<any>, fields: Array<any>, value: string) {
    value = this.convertString(value);

    array = array.filter((item) => {
        fields.forEach(obj => {
            if ( item[obj] ) {
                const _newObj = this.convertString(item[obj]);
                if ( _newObj.indexOf(value) !== -1 ) {
                    console.log(item);
                    return item;
                }
            }
        });
    });

    return array;
}
// convertString() is just another function to replace accents, spaces, etc...

然后我称之为:

filterArray(originalArray, ['name'], valueFromInput);

// or...
filterArray(originalArray, ['value'], valueFromInput);

// or even...
filterArray(originalArray, ['value', 'company'], valueFromInput);

但是,即使indexOf验证中的控制台在控制台上打印了正确的对象,过滤的数组也总是返回空。

我在这里做错了什么?因为它正确过滤,我已手动检查它,但它没有添加到新的过滤数组。

2 个答案:

答案 0 :(得分:4)

您可以使用fields来迭代Array#some,如果其中一个等于value,则返回item

&#13;
&#13;
const array_one = [
  {id: 1, code: 'ABC123', name: 'John'},
  {id: 2, code: 'DEF456', name: 'Stew'}
];

const array_two = [
  {id: 1, value: '012345', company: 'Company 01' },
  {id: 2, value: '678910', company: 'Company 02' }
];

const filterArray = (array, fields, value) => {
  fields = Array.isArray(fields) ? fields : [fields];
  
  return array.filter((item) => fields.some((field) => item[field] === value));
};
  
console.log(filterArray(array_one, 'name', 'Stew'));

console.log(filterArray(array_two, ['id', 'company'], 2));

console.log(filterArray(array_two, ['id', 'company'], 'Company 02'));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

如果你想让过滤器关于多个字段,那么你将它发送给函数的值也应该是数组。 在我的下面的代码中,我假设您要返回达到所有条件的对象(包含您发送给具有相同值的函数的所有属性)

 const array_one = [
      {id: 1, code: 'ABC123', name: 'John'},
      {id: 2, code: 'DEF456', name: 'Stew'},
   ];

   const array_two = [
      {id: 1, value: '012345', company: 'Company 01' },
      {id: 2, value: '678910', company: 'Company 02' },
   ];

   function filterArray(array, fields, value) {
       array = array.filter((item) => {
           const found = fields.every((field, index) => { 
               return item[field] && item[field] === value[index]
           })
           return found
       });
       return array;
   }

   console.log(filterArray(array_one, ['name'], ['Stew']));

   console.log(filterArray(array_two, ['id', 'company'], [1,'Company 01']));