我有一个对象数组,我想根据对象属性值对其进行过滤。我想通过不同的属性来过滤它,所以它需要是动态的。为此,我有一个输入字段,我可以在其中输入内容,然后过滤数组。所以,假设我有这两个不同的数组:
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/