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

标签 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' },
    // ...
];

我想要一个函数,可以根据名称过滤第一个数组,如果我想过滤第二个数组,我想按值过滤它 >.

为此,我构建了这个函数:

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 验证中的控制台在控制台上打印了正确的对象。

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

最佳答案

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

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'));

关于Javascript如何使用filter()内部的forEach()过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44997344/

相关文章:

javascript - Angularjs 手动两种方式绑定(bind)

javascript - Socket.io如何获取房间ID

javascript - ASP.NET MVC 使用 AJAX 将模型传递给 Controller

javascript - 使用 Nightwatch.js 与 Protractor 之间有什么区别

objective-c - 选择 sqlite 表中的所有列并将其存储在(可变)数组中 - 并将数组返回给调用者

c - char的返回链 - C中的getgrouplist

c - do while 循环中省略了 scanf

javascript - 如何使用 TypeScript 为无状态、功能性 React 组件指定(可选)默认 Prop ?

html - 如何在点击时更改按钮颜色?

javascript - 在 Angular2 中导入接口(interface)