JS 二维数组去重

华为OD面试中面试官出了一道编程题:全排列Ⅱ。自己的想法就是先把所有的排列插入一个数组,再对二维数组进行去重。但是在使用 arr.indexOf() 和 set 去重时并没有成功
1、遍历数组,使用indexOf() 方法判断 返回数组 res 中是否包含当前元素;

var arr = [[1, 1, 2], [1, 2, 1], [1, 1, 2]]
var res = []
for (var i = 0; i < arr.length; i++) {
	if (res.indexOf(i) == -1) {
		res.add(arr[i])
	}
}
console.log(res)

输出结果:

zhangmeng@zhangmengdeMacBook-Pro test % node practice.js
[ [ 1, 1, 2 ], [ 1, 2, 1 ], [ 1, 1, 2 ] ]

2、使用 set 对返回数组去重;

var arr = [[1, 1, 2], [1, 2, 1], [1, 1, 2], [1, 2, 2]]
console.log([...new Set(arr)])
输出结果:

```bash
zhangmeng@zhangmengdeMacBook-Pro test % node practice.js
[ [ 1, 1, 2 ], [ 1, 2, 1 ], [ 1, 1, 2 ], [ 1, 2, 2 ] ]

上面两种方法都没有对二维数组去重,原因是indexOf 防范和 set 去重都是使用的元素的引用而不是值
3、使用对象的key不能重复原则,对数组进行去重

var arr = [[1, 1, 2], [1, 2, 1], [1, 1, 2], [1, 2, 3]]
var obj = {}
arr.forEach(item => {
  obj[item] = item
})
console.log(Object.values(obj)) 

输出结果:

zhangmeng@zhangmengdeMacBook-Pro test % node practice.js
[ [ 1, 1, 2 ], [ 1, 2, 1 ], [ 1, 2, 3 ] ]

4、全排列Ⅱ最终的答案:

var permuteUnique = function(nums) {
    var obj = {}
    var dfs = function(arr1, arr2) {
        if (!arr2.length) {
            obj[arr1] = arr1
        }
        for (var i = 0; i < arr2.length; i++) {
            var tmp1 = Object.assign([], arr1)
            var tmp2 = Object.assign([], arr2)
            tmp1.push(tmp2[i])
            tmp2.splice(i, 1)
            dfs(tmp1, tmp2)
        }
    }
    dfs([], nums)
    
    return Object.values(obj)
};

你可能感兴趣的:(面试,javascript,开发语言,ecmascript)