JS遍历数组对象:去重排序后原数组未更新的问题
问题分析与解决方案
核心原因
你遇到的问题本质是:for...of循环里的list_obj是原数组子元素的引用副本,当你执行list_obj = 新数组时,只是改变了这个局部变量的指向,并没有修改arr_lists中原数组元素的引用,所以原数组不会被更新。
解决方法
方法1:通过索引直接修改原数组
直接操作arr_lists的索引位置,把处理后的数组赋值回去:
arr_lists = [arr_1, arr_2, arr_3, arr_4, arr_5, ...] for (let i = 0; i < arr_lists.length; i++) { let processed = arr_lists[i].join().split(',').filter(onlyUnique); processed.sort(); arr_lists[i] = processed; Logger.log(processed); }
方法2:使用map生成处理后的新数组
如果不需要修改原数组,而是生成全新的处理后数组,map是更简洁的写法:
const processedArrLists = arr_lists.map(list => { let processed = list.join().split(',').filter(onlyUnique); processed.sort(); Logger.log(processed); return processed; }); // 若需要覆盖原数组,直接赋值即可: // arr_lists = processedArrLists;
方法3:修改原数组内容(不替换数组对象)
如果要保留原数组对象的引用,可先清空原数组,再重新添加处理后的元素:
arr_lists = [arr_1, arr_2, arr_3, arr_4, arr_5, ...] for (let list of arr_lists) { let processed = list.join().split(',').filter(onlyUnique); processed.sort(); // 清空原数组 list.length = 0; // 批量添加处理后的元素 list.push(...processed); Logger.log(list); }
内容的提问来源于stack exchange,提问作者J. Erik Hartel
相关产品推荐
相关产品推荐

