【问题标题】:How do I remove duplicate arrays inside an array in Javascript?如何在Javascript中删除数组中的重复数组?
【发布时间】:2019-08-29 01:40:02
【问题描述】:

如何在 Javascript 中删除重复的排序数组? 我尝试创建一个新数组,在新集合上使用扩展语法,但这看起来非常复杂,并迫使我的结果集看起来像这样:

[ [ '-', '1', ',', '0', ',', '1' ],
  [ '-', '1', ',', '-', '1', ',', '2' ] ]
[ [ '-', '1', ',', '0', ',', '1' ],
  [ '-', '1', ',', '-', '1', ',', '2' ] ]
[ [ '0', ',', '0', ',', '0' ] ]
[ [ '0', ',', '0', ',', '0' ] ]
[ [ '-', '4', ',', '-', '2', ',', '6' ],
  [ '-', '4', ',', '0', ',', '4' ],
  [ '-', '4', ',', '1', ',', '3' ],
  [ '-', '4', ',', '2', ',', '2' ],
  [ '-', '2', ',', '-', '2', ',', '4' ],
  [ '-', '2', ',', '0', ',', '2' ] ]
[ [ '-', '4', ',', '-', '2', ',', '6' ],
  [ '-', '4', ',', '0', ',', '4' ],
  [ '-', '4', ',', '1', ',', '3' ],
  [ '-', '4', ',', '2', ',', '2' ],
  [ '-', '2', ',', '-', '2', ',', '4' ],
  [ '-', '2', ',', '0', ',', '2' ] ]

[ [ '-1,0,1' ], [ '-1,-1,2' ] ]
[ [ '-1,0,1' ], [ '-1,-1,2' ] ]
[ [ '0,0,0' ] ]
[ [ '0,0,0' ] ]
[ [ '-4,-2,6' ],
  [ '-4,0,4' ],
  [ '-4,1,3' ],
  [ '-4,2,2' ],
  [ '-2,-2,4' ],
  [ '-2,0,2' ] ]
[ [ '-4,-2,6' ],
  [ '-4,0,4' ],
  [ '-4,1,3' ],
  [ '-4,2,2' ],
  [ '-2,-2,4' ],
  [ '-2,0,2' ] ]

请注意,这些是在我将它们设置为字符串之后。 该集合不会删除重复的排序数组,因为它们是不同的对象。

这里是代码。

var threeSum = function (arr) {
    let map = new Map();
    for (let i = 0; i < arr.length; i++) {
        let num = arr[i];
        if (map.has(num)) {
            map.get(num).push(i);
        }
        else {
            map.set(num, [i]);
        }
    }

    const results = [];
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            let diff = (arr[i] + arr[j]);
            diff = (diff == 0) ? diff: diff * -1;
            if (map.has(diff)) {
                let mArr = map.get(diff);
                for (let k = 0; k < mArr.length; k++) {
                    if (mArr[k] != i && mArr[k] != j ) {
                        results.push([arr[i], arr[j], diff]);
                    }
                }
            }
        }
    }

    results.forEach((value) => {
        value.sort((a, b) => { return a - b });
    });
    let newResults = results.filter((val, idx, arr) => {
        /// how do i do this
    })

    console.log(newResults);
    return newResults;

}

console.log(threeSum([-1, 0, 1, 2, -1, -4]));
console.log(threeSum([0,0,0,0]));
console.log(threeSum([-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]));

【问题讨论】:

  • 只要对它们进行排序,您就可以使用 JSON.stringify 或 join() 对数组进行字符串化,并作为字符串键传递给 Set 或 Map
  • 预期输出的格式是什么?
  • 预期:[[-4,-2,6],[-4,0,4],[-4,1,3],[-4,2,2],[- 2,-2,4],[-2,0,2]]
  • 那么输入的内容是什么?
  • 输入:[-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]

标签: javascript arrays duplicates


【解决方案1】:

set 非常适合这项任务。集合保持其所有元素都是唯一的条件。这就是您完成任务的方式:

  1. 创建一个包含结果元素的新集合:let set = new Set(results.map(result =&gt; JSON.stringify(result))
  2. 将集合转换为数组。这可以使用Array.from(set).map(elem =&gt; JSON.parse(elem)) 来完成

【讨论】:

  • 需要对数组进行字符串化,使其在集合中是唯一的。 [1,2] != [1,2]...试试console.log(new Set([[1,2], [1,2]])) // size=2
  • 是的,这给了我完全相同的数组
  • 抱歉,我完全忘记了这一点。如何纠正我的错误是在将结果插入集合之前.map将结果转换为字符串,然后在将它们从集合中拉出时.map将它们返回到数组中。我已经编辑了我的答案以反映这一点。
  • 而且在字符串化之前也必须先排序
  • 啊,但如果结果是 [[1,2],[2,1]] 并且 OP 想要唯一的排序数组......那些将字符串化为 2 个未排序的集合值
【解决方案2】:

results的形成可能还有一些其他的问题,不过要简单的从有序数组中获取唯一项:

定义一个函数来检查数组ab 对于第一个L 索引是否相等(因为a == b 本身不起作用):

let equal = function(a, b, L){
    for (let i=0; i<L; ++i) {
        if (a[i] != b[i]) return false; 
    }
    return true;
}

检测到新项目时推送到newResults

var threeSum(...
...
    if (results.length == 0){
        return [];
    }
    newResults = [results[0]];

    for (let i = 1; i < results.length; ++i){
        if (!equal(results[i], newResults[newResults.length - 1], 3)){
            newResults.push(results[i]);
        }
    }

    return newResults;
}

但可能还有一些其他问题,比如遍历map.get(diff)的所有项目虽然第一项mArr[0]是键(其余都是值)

【讨论】:

    猜你喜欢
    • 2017-10-16
    • 2020-11-01
    • 2014-12-03
    • 2021-05-30
    • 2012-10-04
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多