JavaScript中移除二维数组的完全重复与相似重复项
修正后的代码实现
要同时移除二维数组中的完全重复项和相似重复项(元素相同、顺序相反的二元数组),并保留符合预期的元素,我们需要将每个子数组的排序后形态作为唯一标识,以此判断是否属于相似组,同时优先保留原数组中升序排列的元素(或最后出现的升序元素)。
修正后的代码如下:
let a = [ [5, 6], [1,1], [6,5], [1,1], [3,2], [2,3] ] function makeUnique(arr) { const itemsFound = {}; arr.forEach(item => { // 生成当前子数组的排序版本(不修改原数组) const sorted = [...item].sort((x, y) => x - y); const key = JSON.stringify(sorted); if (!itemsFound[key]) { // 若该相似组未被记录,优先保留原数组中的升序元素,否则存入排序后的标准形态 itemsFound[key] = JSON.stringify(item) === key ? item : sorted; } else { // 若已记录,若当前元素是升序形态,则更新为当前元素(保留最后出现的升序项) if (JSON.stringify(item) === key) { itemsFound[key] = item; } } }); // 将记录的唯一元素转为数组返回 return Object.values(itemsFound); } a = makeUnique(a); console.log(a); // 输出: [ [ 5, 6 ], [ 1, 1 ], [ 2, 3 ] ]
代码说明
- 唯一标识生成:通过将子数组排序后转为字符串,让相似数组(如
[5,6]和[6,5])拥有相同的键,以此识别相似重复项。 - 元素保留规则:
- 对于未记录的相似组,优先保留原数组中本身就是升序的元素;如果当前元素是降序,则存入升序的标准形态。
- 对于已记录的相似组,若后续遇到升序形态的元素,更新为该元素(确保保留最后出现的升序项,如原数组中的
[2,3])。
- 完全重复项处理:由于相同元素的排序后键一致,完全重复的元素会被自动去重。
内容的提问来源于stack exchange,提问作者codproe
相关产品推荐
相关产品推荐

