我有一个数组,如下所示:[[1,3],[2,5],[1,3],[2,5]]
,我想删除任何重复的子数组。我尝试使用以下代码:
uniqueArray = array.filter(function(item, pos) {
return array.indexOf(item) == pos; });
对于所有情况,它仍然返回true。
我该使用哪个函数来获得所需的结果。
我有一个数组,如下所示:[[1,3],[2,5],[1,3],[2,5]]
,我想删除任何重复的子数组。我尝试使用以下代码:
uniqueArray = array.filter(function(item, pos) {
return array.indexOf(item) == pos; });
对于所有情况,它仍然返回true。
我该使用哪个函数来获得所需的结果。
Set
中以自动过滤重复元素。现在将 Set 转换回数组,并通过 JSON 解析每个元素来映射数组以恢复数组。
易读且无嵌套循环。
const arr = [[1,3],[2,5],[1,3],[2,5]];
const setArray = new Set(arr.map(x => JSON.stringify(x)))
const uniqArray = [...setArray].map(x => JSON.parse(x))
console.log(uniqArray)
虽然不是最高效的方法,但可以将子数组用作对象键:
a = [[1,3],[2,5],[1,3],[2,5]]
o = a.reduce((r, v) => (r[v] = v, r), {})
console.log(JSON.stringify( Object.values(o) ))
console.log(JSON.stringify( o ))
更新:使用数字键似乎更快:
let a = [[1,3],[2,5],[1,3],[2,5]], t, b, n = _ => performance.now(),
v = Object.values, l = t => console.log(JSON.stringify(b), t)
t = n(); b = v(a.reduce((r, v) => (r[v] = v, r), {})) ; l(n() - t)
t = n(); b = v(a.reduce((r, v) => (r[v[0] + 1 / v[1]] = v, r), {})) ; l(n() - t)
t = n(); b = v(a.reduce((r, v) => (r[v[0] + 1 / v[1]] = v, r), new Map)); l(n() - t)
var arr = [[1,3],[2,5],[1,3],[2,5]];
var result = arr.filter(function(t) {
var key = t.join('-');
return this[key] ? false : (this[key] = true);
}, Object.create(null));
console.log(result);
key = t.join('-')
。 - RobG
[1,3]
和[3,1]
是重复的吗? - RobG