我正在尝试过滤作为数组的属性上的集合。例如,我有一个收藏集:
const collection = [
{
name: 'one',
type: ['BRANCH']
},
{
name: 'Two',
type: ['OTHER']
},
{
name: 'Three',
type: ['OTHER']
},
]
我有一个过滤器,它也是一个数组:
const filter = ['BRANCH']
现在,我尝试仅返回集合中与过滤器数组匹配的项目。我有以下代码要重构:
const filtered = [];
collection.forEach((item) => {
item.type.forEach((type) => {
if (filters.indexOf(type) !== -1) {
filtered.push(item);
}
})
})
console.log(filtered);
是否有更好的方法在循环内比较这些数组(item.type
和filter
)以仅返回集合中匹配的项目?
答案 0 :(得分:1)
您当前的逻辑可能无法实现您想要的结果-如果type
中有多个项目与filter
中的某个项目匹配,则数组项目将被推送两次 (或更多)。
例如:
const collection = [
{
name: 'one',
type: ['BRANCH']
},
{
name: 'Two',
type: ['OTHER']
},
{
name: 'Three',
type: ['OTHER']
},
{
name: 'one',
type: ['BRANCH', 'FOO']
},
];
const filters = ['BRANCH', 'FOO']
const filtered = [];
collection.forEach((item) => {
item.type.forEach((type) => {
if (filters.indexOf(type) !== -1) {
filtered.push(item);
}
})
})
console.log(filtered);
相反,您可以使用Array.prototype.filter
并检查.some
数组中是否包含type
的 filter
:
const collection = [
{
name: 'one',
type: ['BRANCH']
},
{
name: 'Two',
type: ['OTHER']
},
{
name: 'Three',
type: ['OTHER']
},
]
const filter = ['BRANCH'];
console.log(
collection.filter(({ type }) => (
type.some(item => filter.includes(item))
))
);
假设type
中包含filter
中的 some 个,则您希望结果中包含项。如果要检查filter
的每个项是否在type
数组中,请在Array.prototype.every
数组上使用filter
:
const collection = [
{
name: 'one',
type: ['BRANCH']
},
{
name: 'Two',
type: ['OTHER']
},
{
name: 'Three',
type: ['OTHER']
},
]
const filter = ['BRANCH'];
console.log(
collection.filter(({ type }) => (
filter.every(item => type.includes(item))
))
);
答案 1 :(得分:1)
使用filter
过滤对象,使用every
和includes
检查数组是否相等:
const filtered = collection.filter(obj =>
obj.type.every(item => filter.includes(item))
);
读取内容:从数组collection
过滤对象,其中每个对象的type
数组是数组filter
的子集。
示例:
const collection = [ { name: 'one', type: ['BRANCH'] }, { name: 'Two', type: ['OTHER'] }, { name: 'Three', type: ['OTHER'] } ];
const filter = ['BRANCH'];
const filtered = collection.filter(obj =>
obj.type.every(item => filter.includes(item))
);
console.log(filtered);