JavaScript中如何移除元素位置不同的多维数组重复项?
JavaScript多维数组去重(子数组元素顺序不同视为重复)
当处理多维数组时,如果子数组元素内容相同但顺序不同需要被视为重复项移除,直接用JSON.stringify对比子数组的方式会失效——因为字符串化后的结果会保留元素顺序,导致顺序不同的子数组被判定为不同项。
原数组
let originalArray = [ ["A", "B", "C"], ["B", "A", "C"], ["D", "E", "F"] ];
现有代码的问题
这段代码无法达到期望效果,因为JSON.stringify(["A","B","C"])和JSON.stringify(["B","A","C"])结果不同,会把两个顺序不同的子数组都保留:
let uniqueArray = originalArray.filter((item, index, self) => { return index === self.findIndex((t) => JSON.stringify(t) === JSON.stringify(item)); }); console.log(uniqueArray); // 输出:[["A","B","C"],["B","A","C"],["D","E","F"]]
解决方案:基于排序标识的去重
核心思路是先给每个子数组生成一个排序后的唯一字符串标识,再通过标识判断重复,只保留第一次出现的子数组。
完整实现代码:
// 生成每个子数组排序后的字符串标识(复制子数组再排序,避免修改原数组) const sortedIdentifiers = originalArray.map(subArr => JSON.stringify([...subArr].sort())); // 过滤出仅第一次出现该标识的子数组 const uniqueArray = originalArray.filter((_, index) => { return sortedIdentifiers.indexOf(sortedIdentifiers[index]) === index; }); console.log(uniqueArray); // 输出:[["A","B","C"],["D","E","F"]]
代码说明
[...subArr].sort():复制子数组后排序,避免修改原数组中子数组的元素顺序JSON.stringify(...):将排序后的子数组转为字符串,作为判断重复的唯一标识sortedIdentifiers.indexOf(...) === index:仅保留该标识第一次出现时对应的原数组子数组
内容的提问来源于stack exchange,提问作者Imran Hossain
相关产品推荐
相关产品推荐

