首页 > 解决方案 > 带有 set.has 的过滤器无法按预期工作

问题描述

我正在尝试Set.has像这样过滤数组:

const input = [ 
  { nick: 'Some name', x: 19, y: 24, grp: 4, id: '19340' },
  { nick: 'Some name', x: 20, y: 27, grp: 11, id: '19343' },
  { nick: 'Some name', x: 22, y: 27, grp: 11, id: '19344' },
  { nick: 'Some name', x: 22, y: 30, grp: 11, id: '19350' },
  { nick: 'Some name', x: 22, y: 12, grp: 23, id: '19374' },
  { nick: 'Some name', x: 22, y: 29, grp: 23, id: '19377' } 
];

const grpToOmit = [ 11, 23 ];
const groupToOmitSet = new Set(grpToOmit);

input.filter(it => {
  console.log(groupToOmitSet.has(it.grp))
  return !groupToOmitSet.has(it.grp);
});

console.log(input)

grpToOmit所以我从数组中创建唯一值的集合,然后在过滤器函数中检查它。

这个过滤器没有做任何事情,并且输入数组没有改变,尽管console.log(groupToOmitSet.has(it.grp))控制台为真几次(我在下一行使用了 oposit )。

标签: javascriptarraysfilter

解决方案


.filter生成一个新数组,它不会改变现有数组。您需要将结果分配给变量。

const input = [ 
    { nick: 'Some name', x: 19, y: 24, grp: 4, id: '19340' },
    { nick: 'Some name', x: 20, y: 27, grp: 11, id: '19343' },
    { nick: 'Some name', x: 22, y: 27, grp: 11, id: '19344' },
    { nick: 'Some name', x: 22, y: 30, grp: 11, id: '19350' },
    { nick: 'Some name', x: 22, y: 12, grp: 23, id: '19374' },
    { nick: 'Some name', x: 22, y: 29, grp: 23, id: '19377' } 
];

const grpToOmit = [ 11, 23 ];
const groupToOmitSet = new Set(grpToOmit);

const output = input.filter(it => {
  return !groupToOmitSet.has(it.grp);
});

console.log(output)


推荐阅读