You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除对象数组中属性值匹配普通数组元素的项?

问题:移除对象数组中指定名称的元素

我有一个对象数组countries和普通数组answer,需要移除countries里所有ChoicesName属性值存在于answer中的对象,但自己写的代码无法得到预期结果。

我的尝试代码:

var countries = 
[
{ChoicesID: 1, ChoicesName : 'afghanistan'},
{ChoicesID: 2, ChoicesName : 'albania'},
{ChoicesID: 3, ChoicesName : 'algeria'},
{ChoicesID: 4, ChoicesName : 'angola'},
{ChoicesID: 5, ChoicesName : 'argentina'},
{ChoicesID: 6, ChoicesName : 'armenia'}
];

var answer = ['afghanistan','albania','algeria'];

var ChoicesName = new Set(countries.map(d => d.ChoicesName));
var NewCountries = [...ChoicesName, ...answer.filter(d => !ChoicesName.has(countries.find(o => o.ChoicesName === answer)))];
console.log(NewCountries );

预期输出:

var NewCountries = 
[
  {ChoicesID: 4, ChoicesName : 'angola'},
  {ChoicesID: 5, ChoicesName : 'argentina'},
  {ChoicesID: 6, ChoicesName : 'armenia'}
];

代码问题分析

你当前的逻辑完全偏离需求:

  • 错误地将countries的ChoicesName转为Set后直接展开,又拼接了answer的过滤结果,最终得到的是字符串数组而非对象数组
  • 判断条件countries.find(o => o.ChoicesName === answer)完全错误,answer是数组,不可能和字符串类型的ChoicesName相等,导致过滤逻辑失效

正确解法

核心思路是过滤出ChoicesName不在answer中的对象,用Set优化查找效率:

var countries = 
[
{ChoicesID: 1, ChoicesName : 'afghanistan'},
{ChoicesID: 2, ChoicesName : 'albania'},
{ChoicesID: 3, ChoicesName : 'algeria'},
{ChoicesID: 4, ChoicesName : 'angola'},
{ChoicesID: 5, ChoicesName : 'argentina'},
{ChoicesID: 6, ChoicesName : 'armenia'}
];

var answer = ['afghanistan','albania','algeria'];

// 将answer转为Set,提升查找效率
var excludedNames = new Set(answer);
// 过滤出ChoicesName不在excludedNames中的对象
var NewCountries = countries.filter(country => !excludedNames.has(country.ChoicesName));

console.log(NewCountries);

如果数据量较小,也可以直接用数组的includes方法(无需转Set):

var NewCountries = countries.filter(country => !answer.includes(country.ChoicesName));

两种方法都能得到你想要的预期输出。


内容的提问来源于stack exchange,提问作者Strywyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:03:14