如何根据名称列表从字典列表中移除指定元素
解决方法
方法一:用filter快速实现(推荐)
filter是最简洁的方式,它会返回一个新数组,自动过滤掉不需要的元素,不会修改原数组:
const arr1 = [{name:'item0',value:0},{name:'item1',value:1},{name:'item2',value:2},{name:'item3',value:3}]; const itemsToRemove = ['item1','item2']; const result = arr1.filter(item => !itemsToRemove.includes(item.name)); console.log(result); // 输出:[{name:'item0',value:0},{name:'item3',value:3}]
如果一定要修改原数组本身,直接把结果重新赋值给arr1就行:
arr1 = arr1.filter(item => !itemsToRemove.includes(item.name));
方法二:正确用splice修改原数组
你之前用splice失败,主要是两个问题:一是可能搞错了目标元素的索引,二是正向遍历删除会导致数组索引错位。正确的做法是从后往前遍历数组,这样删除元素不会影响前面未遍历的项:
const arr1 = [{name:'item0',value:0},{name:'item1',value:1},{name:'item2',value:2},{name:'item3',value:3}]; const itemsToRemove = ['item1','item2']; // 倒序遍历,避免索引错位 for (let i = arr1.length - 1; i >= 0; i--) { if (itemsToRemove.includes(arr1[i].name)) { arr1.splice(i, 1); // 删除当前索引的元素 } } console.log(arr1); // 输出:[{name:'item0',value:0},{name:'item3',value:3}]
为啥正向遍历不行?
举个例子:当你删除索引1的item1后,原数组长度变成3,原本索引2的item2会自动移到索引1的位置。如果接着遍历i=2,就会跳过这个item2,导致删不干净。倒序遍历就不会有这个问题,因为每次删除的都是后面的元素,前面的索引不会被影响。
内容的提问来源于stack exchange,提问作者venkat0107
相关产品推荐
相关产品推荐

