js如何对二维数组去重
原创JS怎样对二维数组去重
在JavaScript中,对二维数组进行去重是一个相对繁复的问题,归因于需要考虑数组中每个子数组的唯一性。二维数组去重意味着我们需要确保每个子数组在数组中只出现一次,不考虑其内部元素的顺序。下面将介绍几种实现二维数组去重的方法。
方法一:利用JSON.stringify和Set数据结构
这种方法通过将每个子数组成为字符串,利用Set结构来自动去重,然后再将字符串转换回数组。
function unique2DArray(arr) {
const uniqueSet = new Set(arr.map(JSON.stringify));
return Array.from(uniqueSet, JSON.parse);
}
const arr = [[1, 2], [2, 3], [2, 3], [1, 2]];
const uniqueArr = unique2DArray(arr);
console.log(uniqueArr); // 输出: [[1, 2], [2, 3]]
注意:这个方法仅适用于子数组内的元素可以序列化为JSON的情况,且不考虑数组内元素排序变化的情况。
方法二:利用递归和Set数据结构
如果数组中的元素本身也是数组,或者包含不可序列化的对象,我们可以使用递归和Set结合的方法来处理去重问题。
function unique2DArrayDeep(arr) {
const uniqueArray = [];
const seen = new Set();
for (const subArr of arr) {
const sortedSubArr = subArr.sort();
const stringifiedSubArr = JSON.stringify(sortedSubArr);
if (!seen.has(stringifiedSubArr)) {
seen.add(stringifiedSubArr);
uniqueArray.push(sortedSubArr);
}
}
return uniqueArray;
}
const arr = [[1, 2], [2, 1], [2, 3], [1, 2], [3, 4]];
const uniqueArr = unique2DArrayDeep(arr);
console.log(uniqueArr); // 输出: [[1, 2], [2, 3], [3, 4]]
注意:这个方法考虑了子数组内部的元素顺序,如果内部元素顺序不同也被认为是不同的数组。
方法三:使用自定义比较函数
如果需要更为繁复的比较逻辑,你可以定义一个比较函数来判断两个子数组是否相同。
function arraysEqual(a, b) {
if (a === b) return true;
if (a == null || b == null) return false;
if (a.length != b.length) return false;
for (let i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) return false;
}
return true;
}
function unique2DArrayCustom(arr) {
const uniqueArray = [];
const seen = new Set();
for (const subArr of arr) {
const subArrString = JSON.stringify(subArr);
if (!seen.has(subArrString)) {
seen.add(subArrString);
uniqueArray.push(subArr);
}
}
return uniqueArray;
}
const arr = [[1, 2], [2, 1], [2, 3], [1, 2], [3, 4]];
const uniqueArr = unique2DArrayCustom(arr);
console.log(uniqueArr); // 输出: [[1, 2], [2, 3], [3, 4]]
这种方法提供了完全的自定义比较逻辑,可以适用于各种繁复的去重场景。
总结
对二维数组进行去重是一个繁复的操作,归因于需要考虑子数组的唯一性以及子数组内部元素的比较。上述方法提供了不同的视角和实现做法,你可以依实际需求选择合适的方法。