我有一个对象数组,我想根据对象的属性值对其进行过滤。我想通过不同的属性进行过滤,因此它需要是动态的。为此,我有一个输入字段,我在其中键入,然后过滤数组。因此,假设我有这两个不同的数组:
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
验证中控制台打印了正确的对象。
我在这里做错了什么?因为它可以正确地进行过滤,我已经手动检查过了,但它不会添加到新的过滤数组中。
forEach()
时,在回调中返回某些内容将不会产生任何效果。如果您想将每个项目映射到其他内容,请使用map()
。如果您正在定义函数体,就像您为filter()
回调所做的那样,必须使用return
关键字,否则该回调将隐式返回undefined
。 - Lennholm