JavaScript多条件过滤对象数组问题求助
解决数组过滤问题:移除特定规则的对象
我来帮你搞定这个数组过滤的需求!你想要移除的是**type属性前缀不是A、C、G,同时后缀是utt、alt、mor**的对象,用Array.filter()方法会比手动用splice遍历更可靠,也更简洁——毕竟splice在遍历数组时容易因为索引变化导致漏处理或重复处理元素。
解决方案代码
我们可以直接通过filter创建符合要求的新数组,逻辑是保留以下两种对象:
type的前缀是A、C、G之一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
相关产品推荐
相关产品推荐

