删除重复的子数组

3

我有一个数组,如下所示:[[1,3],[2,5],[1,3],[2,5]],我想删除任何重复的子数组。我尝试使用以下代码:

 uniqueArray = array.filter(function(item, pos) {
   return array.indexOf(item) == pos;   });

对于所有情况,它仍然返回true。

我该使用哪个函数来获得所需的结果。


您可能需要查看以下链接以了解如何从JavaScript数组中删除重复项:https://dev59.com/iWox5IYBdhLWcg3waziQ - S. Walker
数组总是以相同的方式排序吗?[1,3][3,1]是重复的吗? - RobG
3个回答

4
将二维数组转换为字符串元素的一维数组,然后将其放入一个 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)


对我来说,这是最直接的方式。虽然其他方法也可以。 - Kostis

3

虽然不是最高效的方法,但可以将子数组用作对象键:

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)


不确定为什么您认为它不高效。 - charlietfl
由于子数组被转换为字符串进行比较,而不是直接比较子数组,所以会出现这种情况。 - Slai
但是迭代回去比较每个子数组会很耗费资源。 - charlietfl

2
你可以使用 Array#filter 方法,并使用一个对象来存储迭代元组的哈希值:

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);


所以基本上对象是作为参数创建的? - Kostis
不是的。对象是由Array#filter传递给对象的this创建的。当前元组(子数组)作为参数传递给回调函数。 - Ori Drori
2
我认为“哈希”应该改名为“键”或类似的名称,并且可以简单地写成key = t.join('-') - RobG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接