У меня есть следующие данные, которые я пытаюсь дедуплицировать:
Действительный
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 []
Что мне не хватает?
var data = [
['dupeValue', { data: 123 }],
['dupeValue', { data: 123 }],
['otherValue', { data: 1111111 }],
['dupeValue', { data: 123 }]
]
var result = data.filter((value, i, arr) => {
return value[0] !== arr[i][0]
})
console.info(result)Вы де-дублируете значение подмассива, которое я предполагаю.
Обратите внимание, что ваш код выглядит так, как будто вы проверяете только первое значение в подмассиве, а не фактические данные. Если бы один из элементов был ["dupeValue", { data: "unique" }], он тоже был бы удален.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш тест фильтра
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.info(result)Вы можете использовать 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.info(result)
arr[i]такой же, какvalue, поэтому первый элемент в каждом всегда будет равен