技术解析

关于嵌套数组去重保留原格式?
0
2021-08-10 04:14:55
idczone
var arr=[[100,200],[111,222],[100,200],[111,222],[100,200],[111,222]];

网上找了个方法
function mapArr(arr) {
let newArr = [];
for(var i=0;i if(Array.isArray(arr[i])) {
let dealArr = this.mapArr(arr[i]);
newArr = [...newArr,...dealArr];
}else {
newArr.push(arr[i]);
}
}
let shoArr = [...new Set(newArr)];
let arrs = shoArr.sort((a,b)=>a-b); //a-b<0 升序
return arrs;
}
mapArr(arr); //[100, 111, 200, 222]

只剩一层数组了。 如果能保留原格式的情况下去重? 谢谢!
保留原格式是什么意思啊?

[... new Set([[100,200],[111,222],[100,200],[111,222],[100,200],[111,222]].flatMap(e => e))] 这样行吗?

就是单纯去重,不 flatten 对吧,保留嵌套形式。
那重复的元素去掉后面的保留第一个吗?



嗯 , 我想得到的是[[100,200],[111,222]]这样的

你要去重的是里面相同的数组(看起来相同),还是每个数组里的元素?
不好意思,意思还不是很明确

去除 arr 里面完全相同的数组。
[[100,200],[111,222],[100,200],[111,222],[100,200],[111,222]]
得到
[[100,200],[111,222]]

就是把重复的去除,每种只保留一个

如果数组里的结构确定了,试试用 map ?
比如 key 用 100 、111,value 用于记录后续的值,比如 200-xxx-yyy 这样。因为是完全相同,所以不存在重复 key 的情况。最后再把 map 转成数组。

如果只是一层数组套一层数组:
```js
function isEqual(a, b) {
if (a.length !== b.length) {
return false;
} else {
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
}
function removeRepeat(arr) {
let newArr = [];
while (arr.length) {
let temp = arr.shift();
newArr.push(temp);
arr = arr.filter((item) => !isEqual(item, temp));
}
return newArr;
}
var arr = [
[100, 200],
[111, 222],
[100, 200],
[111, 222],
[100, 200],
[111, 222],
];
removeRepeat(arr);
```
没有考虑套的数字里面还有非基本类型的情况。如果还有更多需求,再补充吧。

lodash 实现
_.uniqWith(arr, _.isEqual)

谢谢老哥, 辛苦。 完美实现

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服