关于嵌套数组去重保留原格式?

2021-05-08 18:27:33 +08:00
 maloneleo88
var arr=[[100,200],[111,222],[100,200],[111,222],[100,200],[111,222]];

网上找了个方法
function mapArr(arr) {
let newArr = [];
for(var i=0;i<arr.length;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]

只剩一层数组了。 如果能保留原格式的情况下去重? 谢谢!
1362 次点击
所在节点    JavaScript
10 条回复
palmers
2021-05-08 18:34:42 +08:00
保留原格式是什么意思啊?
palmers
2021-05-08 18:34:54 +08:00
[... new Set([[100,200],[111,222],[100,200],[111,222],[100,200],[111,222]].flatMap(e => e))] 这样行吗?
zoeliu
2021-05-08 18:36:36 +08:00
就是单纯去重,不 flatten 对吧,保留嵌套形式。
那重复的元素去掉后面的保留第一个吗?
maloneleo88
2021-05-08 18:49:27 +08:00
@palmers
@zoeliu
嗯 , 我想得到的是[[100,200],[111,222]]这样的
zoeliu
2021-05-08 18:57:06 +08:00
@maloneleo88 你要去重的是里面相同的数组(看起来相同),还是每个数组里的元素?
不好意思,意思还不是很明确
maloneleo88
2021-05-08 19:09:42 +08:00
@zoeliu 去除 arr 里面完全相同的数组。

[[100,200],[111,222],[100,200],[111,222],[100,200],[111,222]]
得到
[[100,200],[111,222]]


就是把重复的去除,每种只保留一个
orzorzorzorz
2021-05-08 19:26:31 +08:00
如果数组里的结构确定了,试试用 map ?
比如 key 用 100 、111,value 用于记录后续的值,比如 200-xxx-yyy 这样。因为是完全相同,所以不存在重复 key 的情况。最后再把 map 转成数组。
zoeliu
2021-05-08 19:41:43 +08:00
如果只是一层数组套一层数组:

```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);
```
没有考虑套的数字里面还有非基本类型的情况。如果还有更多需求,再补充吧。
violetlai
2021-05-08 19:43:25 +08:00
lodash 实现
_.uniqWith(arr, _.isEqual)
maloneleo88
2021-05-08 21:29:55 +08:00
@zoeliu 谢谢老哥, 辛苦。 完美实现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775719

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX