V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
maloneleo88
V2EX  ›  JavaScript

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

  •  
  •   maloneleo88 · 2021-05-08 18:27:33 +08:00 · 1514 次点击
    这是一个创建于 1295 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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]

    只剩一层数组了。 如果能保留原格式的情况下去重? 谢谢!
    10 条回复    2021-05-08 21:29:55 +08:00
    palmers
        1
    palmers  
       2021-05-08 18:34:42 +08:00
    保留原格式是什么意思啊?
    palmers
        2
    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
        3
    zoeliu  
       2021-05-08 18:36:36 +08:00 via Android
    就是单纯去重,不 flatten 对吧,保留嵌套形式。
    那重复的元素去掉后面的保留第一个吗?
    maloneleo88
        4
    maloneleo88  
    OP
       2021-05-08 18:49:27 +08:00
    @palmers
    @zoeliu
    嗯 , 我想得到的是[[100,200],[111,222]]这样的
    zoeliu
        5
    zoeliu  
       2021-05-08 18:57:06 +08:00 via Android
    @maloneleo88 你要去重的是里面相同的数组(看起来相同),还是每个数组里的元素?
    不好意思,意思还不是很明确
    maloneleo88
        6
    maloneleo88  
    OP
       2021-05-08 19:09:42 +08:00 via Android
    @zoeliu 去除 arr 里面完全相同的数组。

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


    就是把重复的去除,每种只保留一个
    orzorzorzorz
        7
    orzorzorzorz  
       2021-05-08 19:26:31 +08:00
    如果数组里的结构确定了,试试用 map ?
    比如 key 用 100 、111,value 用于记录后续的值,比如 200-xxx-yyy 这样。因为是完全相同,所以不存在重复 key 的情况。最后再把 map 转成数组。
    zoeliu
        8
    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
        9
    violetlai  
       2021-05-08 19:43:25 +08:00
    lodash 实现
    _.uniqWith(arr, _.isEqual)
    maloneleo88
        10
    maloneleo88  
    OP
       2021-05-08 21:29:55 +08:00
    @zoeliu 谢谢老哥, 辛苦。 完美实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1821 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 16:32 · PVG 00:32 · LAX 08:32 · JFK 11:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.