JavaScript如何使用filter方法筛选匹配对象键名的数组项
错误原因
你写的筛选代码存在两处问题,导致无法得到预期结果:
- 变量名大小写不匹配:定义的状态对象名为
innerstate(s小写),筛选逻辑里误写为innerState(S大写),会直接抛出未定义错误 - 判断逻辑错误:
Object.keys()返回的是由对象键名组成的数组,直接拿字符串类型的v.name和整个数组做不等比较,结果永远为true,完全起不到筛选作用;且逻辑方向写反,你需要匹配name存在于键名列表中的项,而非不相等的项。
修正方案
使用Array.includes()判断当前项的name属性是否存在于键名数组中即可,修正后核心筛选代码如下:
// 先取出innerstate的所有键名组成数组 const stateKeys = Object.keys(innerstate); const answer = diaryItems.filter(item => stateKeys.includes(item.name));
运行上述代码得到的answer和你给出的预期结果完全一致。
性能优化提示:如果
diaryItems数据量较大,可以将键名存入Set来把查找复杂度从O(n)降到O(1):const stateKeySet = new Set(Object.keys(innerstate)); const answer = diaryItems.filter(item => stateKeySet.has(item.name));
内容的提问来源于stack exchange,提问作者user15322469
相关产品推荐
相关产品推荐

