Google Apps Script数组遍历满足条件时循环中断问题求助
数组元素过滤问题解决方法
问题背景
我有一个数组:
var Concat_names = ['Prod 1-Volume based deal-100 sections','Test Prod 1-Included Members-MB','Prod 2-Commitment + Excess-100 sections','Prod 1-Flat Mon-TB'];
需要完成两个需求:
- 移除包含“Flat Mon”的元素
- 移除包含“Included Members”的元素
我尝试了以下代码,但执行时循环会中断,导致遗漏元素,实际输出是 [ 'Prod 1-Volume based deal-100 sections' ],而预期输出应该是 ['Prod 1-Volume based deal-100 sections','Prod 2-Commitment + Excess-100 sections']:
for (var i in Concat_names) { var check_included_mem = Concat_names[i].includes("Included Members"); if (check_included_mem == true) { Concat_names.splice(i); } } console.log(Concat_names); for (var y in Concat_names){ var check_flat_mon = new RegExp(/Flat Mon/).test(Concat_names[y]); if (check_flat_mon==true){ Concat_names.splice(y); } } console.log(Concat_names);
问题原因
for...in不适合遍历数组:for...in是用来遍历对象属性的,遍历数组时拿到的是索引字符串,还可能遍历到数组原型上的额外属性,不适合处理数组修改操作。splice用法错误:splice(i)会从索引i开始删除所有剩余元素,而不是只删当前元素,正确写法是splice(i, 1)(删除索引i处的1个元素)。- 正向遍历修改数组导致索引偏移:就算用了
splice(i,1),正向遍历删除元素后,后面的元素会前移,比如删了索引1的元素,原索引2的元素会变成索引1,但循环会继续到索引2,直接跳过这个元素。
解决方案
方法1:使用filter方法(推荐,简洁不修改原数组)
filter会返回新数组,包含所有符合条件的元素,代码最简洁:
var Concat_names = ['Prod 1-Volume based deal-100 sections','Test Prod 1-Included Members-MB','Prod 2-Commitment + Excess-100 sections','Prod 1-Flat Mon-TB']; const filteredNames = Concat_names.filter(item => { return !item.includes("Included Members") && !item.includes("Flat Mon"); }); console.log(filteredNames); // 输出:['Prod 1-Volume based deal-100 sections','Prod 2-Commitment + Excess-100 sections']
方法2:反向遍历数组(原地修改原数组)
如果必须原地修改原数组,从后往前遍历就不会因为元素前移导致索引偏移:
var Concat_names = ['Prod 1-Volume based deal-100 sections','Test Prod 1-Included Members-MB','Prod 2-Commitment + Excess-100 sections','Prod 1-Flat Mon-TB']; // 移除包含"Included Members"的元素 for (let i = Concat_names.length - 1; i >= 0; i--) { if (Concat_names[i].includes("Included Members")) { Concat_names.splice(i, 1); } } // 移除包含"Flat Mon"的元素 for (let y = Concat_names.length - 1; y >= 0; y--) { if (Concat_names[y].includes("Flat Mon")) { Concat_names.splice(y, 1); } } console.log(Concat_names); // 输出:['Prod 1-Volume based deal-100 sections','Prod 2-Commitment + Excess-100 sections']
方法3:while循环正向遍历(处理索引偏移)
如果要正向遍历,删除元素后不递增索引,避免跳过前移的元素:
var Concat_names = ['Prod 1-Volume based deal-100 sections','Test Prod 1-Included Members-MB','Prod 2-Commitment + Excess-100 sections','Prod 1-Flat Mon-TB']; let i = 0; while (i < Concat_names.length) { const item = Concat_names[i]; if (item.includes("Included Members") || item.includes("Flat Mon")) { Concat_names.splice(i, 1); // 删除后索引不递增,后面的元素前移到当前位置 } else { i++; } } console.log(Concat_names); // 输出:['Prod 1-Volume based deal-100 sections','Prod 2-Commitment + Excess-100 sections']
内容的提问来源于stack exchange,提问作者Shaik Naveed
相关产品推荐
相关产品推荐

