js Map如何数组去重
时间: 2023-08-07 22:10:44 AIGC 浏览: 125
在JavaScript中,可以使用Map来实现数组去重。以下是一种常见的方法:
```javascript
function deduplicateArray(arr) {
const map = new Map();
const deduplicatedArray = [];
for (let i = 0; i < arr.length; i++) {
const item = arr[i];
if (!map.has(item)) {
map.set(item, true);
deduplicatedArray.push(item);
}
}
return deduplicatedArray;
}
const array = [1, 2, 3, 2, 4, 3, 5];
const deduplicatedArray = deduplicateArray(array);
console.log(deduplicatedArray); // 输出: [1, 2, 3, 4, 5]
```
在上面的代码中,我们使用Map来存储数组中的元素。当遍历数组时,如果Map中不存在当前元素,则将其添加到Map中,并将其添加到去重后的数组中。这样就可以实现数组去重,并保持原始数组的顺序。
值得注意的是,Map的键是唯一的,因此可以用来去除重复元素。而Set也可以实现数组去重,但它会改变原始数组的顺序,因为Set是无序的。因此,如果需要保持原始顺序,使用Map是更好的选择。
相关问题
js json数组去重
可以使用ES6的Set数据结构来去重,具体代码如下:
let arr = [1, 2, 3, 3, 4, 4, 5];
let uniqueArr = Array.from(new Set(arr));
console.log(uniqueArr); // [1, 2, 3, 4, 5]
如果需要去重的是包含JSON对象的数组,则可以先将数组中的JSON对象序列化成字符串,再进行去重操作,最后再将字符串还原为JSON对象,具体代码如下:
let arr = [{name: 'Tom', age: 18}, {name: 'Jack', age: 20}, {name: 'Tom', age: 18}];
let uniqueArr = Array.from(new Set(arr.map(JSON.stringify))).map(JSON.parse);
console.log(uniqueArr); // [{name: "Tom", age: 18}, {name: "Jack", age: 20}]
js多维数组去重
### JavaScript 多维数组去重的方法
在 JavaScript 中对多维数组进行去重是一个常见的需求。以下是一些实现多维数组去重的解决方案。
#### 方法一:递归与 `Set` 结合
可以使用递归的方式遍历多维数组,并结合 `Set` 来确保每个元素只出现一次。此方法适用于嵌套层级不确定的情况。
```javascript
function deepUniq(arr) {
const seen = new Set();
function helper(item) {
if (Array.isArray(item)) {
return item.map(helper).filter((el) => {
const key = JSON.stringify(el);
if (seen.has(key)) return false;
seen.add(key);
return true;
});
}
return item;
}
return helper(arr);
}
const arr = [[1, 2], [3, 4], [1, 2], [5, 6]];
console.log(deepUniq(arr)); // 输出: [[1, 2], [3, 4], [5, 6]]
```
这种方法利用了 `Set` 的唯一性特性,同时通过递归处理多维数组[^1]。
#### 方法二:基于 `reduce` 和 `JSON.stringify`
对于二维数组(或固定嵌套深度的多维数组),可以使用 `reduce` 方法来构建一个新数组,并通过 `JSON.stringify` 将子数组转换为字符串形式以检测重复项。
```javascript
function uniq2DArray(arr) {
return arr.reduce((acc, curr) => {
const str = JSON.stringify(curr);
if (!acc.some(el => JSON.stringify(el) === str)) {
acc.push(curr);
}
return acc;
}, []);
}
const arr2D = [[1, 2], [3, 4], [1, 2], [5, 6]];
console.log(uniq2DArray(arr2D)); // 输出: [[1, 2], [3, 4], [5, 6]]
```
该方法的时间复杂度较高,但由于使用了 `JSON.stringify`,它能够有效处理嵌套数组的比较问题[^2]。
#### 方法三:双重循环过滤
如果需要保留原始顺序并且不依赖现代方法(如 `Set` 或 `reduce`),可以使用双重循环逐一比较并过滤重复项。
```javascript
function uniqueByLoop(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
let isDuplicate = false;
for (let j = 0; j < result.length; j++) {
if (JSON.stringify(arr[i]) === JSON.stringify(result[j])) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) result.push(arr[i]);
}
return result;
}
const arrNested = [[1, 2], [3, 4], [1, 2], [5, 6]];
console.log(uniqueByLoop(arrNested)); // 输出: [[1, 2], [3, 4], [5, 6]]
```
这种方法虽然简单,但时间复杂度较高,适合小规模数据集[^3]。
### 注意事项
- 对于深层嵌套的数组,推荐使用递归方法。
- 使用 `JSON.stringify` 时需注意其可能无法正确区分某些复杂对象(如包含函数或 `undefined` 的对象)。
- 如果性能是关键因素,应避免频繁调用 `JSON.stringify`,可考虑其他优化策略。
阅读全文
相关推荐

















