使用Array.prototype.filter()不会对数组重复数据删除

时间:2019-03-28 00:20:23

标签: javascript arrays

我要删除以下数据:

实际

where num in (select course from enrollment)

期望

var data = [
  ['dupeValue', { data: 123 }],
  ['dupeValue', { data: 123 }],
  ['otherValue', { data: 1111111 }],
  ['dupeValue', { data: 123 }]
]

我尝试了以下操作,但不起作用:

var data = [
  ['dupeValue', { data: 123 }],
  ['otherValue', { data: 1111111 }]
]

我想念什么?

data.filter((value, i, arr) => {
  return value[0] !== arr[i][0]
})
// outputs []

2 个答案:

答案 0 :(得分:3)

您的过滤器测试是

var result = data.filter((value, i, arr) => {
  return value[0] !== arr[i][0]
});

但是arr[i]将始终引用正在迭代的当前元素-value,因此无论输入如何,value[0] !== arr[i][0]都将始终求值为false。 (因为value === arr[i],所以value[0] === arr[i][0])。

您可以将value[0]添加到Set,并在测试时检查该值是否存在于该集合中:

var data = [
  ['dupeValue', { data: 123 }],
  ['dupeValue', { data: 123 }],
  ['otherValue', { data: 1111111 }],
  ['dupeValue', { data: 123 }]
]

const firstElements = new Set();
var result = data.filter(([firstElement]) => {
  const alreadyHas = firstElements.has(firstElement);
  firstElements.add(firstElement);
  return !alreadyHas;
})

console.log(result)

答案 1 :(得分:3)

您可以使用reduce()映射到对象,并使用Object.values()获取结果数组

var data = [
  ['dupeValue', { data: 123 }],
  ['dupeValue', { data: 123 }],
  ['otherValue', { data: 1111111 }],
  ['dupeValue', { data: 123 }]
]

var result = Object.values(data.reduce((a, c) => (a[c[0]] = c, a), {}))
 

console.log(result)