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

JavaScript多条件过滤对象数组问题求助

解决数组过滤问题:移除特定规则的对象

我来帮你搞定这个数组过滤的需求!你想要移除的是**type属性前缀不是A、C、G,同时后缀是utt、alt、mor**的对象,用Array.filter()方法会比手动用splice遍历更可靠,也更简洁——毕竟splice在遍历数组时容易因为索引变化导致漏处理或重复处理元素。

解决方案代码

我们可以直接通过filter创建符合要求的新数组,逻辑是保留以下两种对象:

  1. type的前缀是A、C、G之一
  2. type的后缀不是utt、alt、mor之一
const fieldValues = [
  { "language": "language1", "type": "A-def" },
  { "language": "language1", "type": "B-def" },
  { "language": "language3", "type": "C-def" },
  { "language": "language4", "type": "D-def" },
  { "language": "language5", "type": "E-def" },
  { "language": "language6", "type": "F-def" },
  { "language": "language7", "type": "G-def" },
  { "language": "language1", "type": "A-utt" },
  { "language": "language1", "type": "B-utt" },
  { "language": "language3", "type": "C-utt" },
  { "language": "language4", "type": "D-utt" },
  { "language": "language5", "type": "E-utt" },
  { "language": "language6", "type": "F-utt" },
  { "language": "language7", "type": "G-utt" },
  { "language": "language1", "type": "A-kat" },
  { "language": "language1", "type": "B-kat" },
  { "language": "language3", "type": "C-kat" },
  { "language": "language4", "type": "D-kat" },
  { "language": "language5", "type": "E-kat" },
  { "language": "language6", "type": "F-kat" },
  { "language": "language7", "type": "G-kat" },
  { "language": "language1", "type": "A-alt" },
  { "language": "language1", "type": "B-alt" },
  { "language": "language3", "type": "C-alt" },
  { "language": "language4", "type": "D-alt" },
  { "language": "language5", "type": "E-alt" },
  { "language": "language6", "type": "F-alt" },
  { "language": "language7", "type": "G-alt" },
  { "language": "language1", "type": "A-mor" },
  { "language": "language1", "type": "B-mor" },
  { "language": "language3", "type": "C-mor" },
  { "language": "language4", "type": "D-mor" },
  { "language": "language5", "type": "E-mor" },
  { "language": "language6", "type": "F-mor" },
  { "language": "language7", "type": "G-mor" }
];

// 过滤逻辑:排除前缀非A/C/G且后缀是utt/alt/mor的对象
const filteredValues = fieldValues.filter(item => {
  const [prefix, suffix] = item.type.split('-');
  // 保留的条件:要么前缀是A/C/G,要么后缀不在目标列表里
  return ['A', 'C', 'G'].includes(prefix) || !['utt', 'alt', 'mor'].includes(suffix);
});

console.log(filteredValues);

为什么之前用splice没得到预期结果?

当你用splice遍历数组时,删除元素会导致数组的长度和后续元素的索引发生变化。比如你在索引i删除了一个元素,原来的i+1位置的元素会移到i的位置,但循环的i++会直接跳过这个元素,导致它没被检查。而filter方法是创建一个新数组,不会修改原数组,也不存在索引混乱的问题,更适合这种场景。

验证结果

运行上面的代码后,得到的filteredValues就是你给出的预期数组,完全符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:33:12