【问题标题】:Deleting arrays of same elements in 2 dimensional array in Javascript在Javascript中删除二维数组中相同元素的数组
【发布时间】:2021-12-28 05:06:17
【问题描述】:

我想知道您将如何删除二维数组中包含相同元素的数组。

例如:

let 2dArr = [ [1, 2, 3],
              [3, 2, 1],
              [2, 4, 5],
              [4, 5, 2],
              [4, 3, 1] ];

这个数组会删除第二个和第四个元素,返回二维数组:

returnedArr = [ [1, 2, 3],
                [2, 4, 5],
                [4, 3, 1] ];

如何做到这一点,保留二维数组?我只能考虑循环遍历元素,通过排序比较元素,然后删除它们,但是如果删除元素,则会导致索引错误。

【问题讨论】:

    标签: javascript arrays multidimensional-array


    【解决方案1】:

    1) 您可以使用reduceSet 轻松实现结果:

    let twodArr = [
      [1, 2, 3],
      [3, 2, 1],
      [2, 4, 5],
      [4, 5, 2],
      [4, 3, 1],
    ];
    
    const set = new Set();
    
    const result = twodArr.reduce((acc, curr) => {
      const key = [...curr].sort((a, b) => a - b).join();
      if (!set.has(key)) {
        set.add(key);
        acc.push(curr);
      }
      return acc;
    }, []);
    
    console.log(result);

    2) 您还可以将过滤器用作:

    let twodArr = [
      [1, 2, 3],
      [3, 2, 1],
      [2, 4, 5],
      [4, 5, 2],
      [4, 3, 1],
    ];
    
    const set = new Set();
    
    const result = twodArr.filter((curr) => {
      const key = [...curr].sort((a, b) => a - b).join();
      return !set.has(key) ? (set.add(key), true) : false;
    });
    
    console.log(result);

    【讨论】:

    • 需要数字排序。在这里工作正常,只是因为都是个位数
    • @charlietfl 修改了代码。感谢您指出错误...
    • 只是疏忽,绝不会出错!
    【解决方案2】:
    const seen = []
    
    const res = array.filter((item) => {
      let key = item.sort().join()
      if(!seen.includes(key)){
        seen.push(key)
        return item
      }
    })
    
    console.log(res)
    

    【讨论】:

      【解决方案3】:

      你可以使用哈希映射

      let arr = [ [1, 2, 3], [3, 2, 1],[2, 4, 5],[4, 5, 2],[4, 3, 1] ];
      let obj = {}
      let final = []
      
      for(let i=0; i<arr.length; i++){
        // create a key
        let sorted = [...arr[i]].sort((a,b)=> a- b).join`,`
        // check if this is not present in our hash map
        // add value to final out and update hash map accordingly
        if(!obj[sorted]){
          obj[sorted] = true
          final.push(arr[i])
        }
      }
      
      console.log(final)

      【讨论】:

        【解决方案4】:

        使用 Array.prototype.filter() 和一个 Set 作为 thisArg

        let arr = [ [1, 2, 3],
                      [3, 2, 1],
                      [2, 4, 5],
                      [4, 5, 2],
                      [4, 3, 1] ];
        
        
        let res = arr.filter(function(e){
            const sorted = [...e].sort((a,b) => a-b).join('|');
            return this.has(sorted) ? false : this.add(sorted)    
        },new Set)
        
        console.log(res)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-30
          • 1970-01-01
          • 1970-01-01
          • 2013-05-16
          • 2012-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多