Используя ES6 + в одной строке, вы можете получить уникальный список объектов по ключу:
const unique = [...new Map(arr.map(item => [item[key], item])).values()]
Это может быть помещено в функцию:
function getUniqueListBy(arr, key) {
return [...new Map(arr.map(item => [item[key], item])).values()]
}
Вот рабочий пример:
const arr = [
{place: "here", name: "x", other: "other stuff1" },
{place: "there", name: "x", other: "other stuff2" },
{place: "here", name: "y", other: "other stuff4" },
{place: "here", name: "z", other: "other stuff5" }
]
function getUniqueListBy(arr, key) {
return [...new Map(arr.map(item => [item[key], item])).values()]
}
const arr1 = getUniqueListBy(arr, 'place')
console.log("Unique by place")
console.log(JSON.stringify(arr1))
console.log("\nUnique by name")
const arr2 = getUniqueListBy(arr, 'name')
console.log(JSON.stringify(arr2))
Как это работает
Сначала массив переопределяется таким образом, чтобы его можно было использовать в качестве входных данных для карты.
arr.map (item => [item [key], item]);
что означает, что каждый элемент массива будет преобразован в другой массив с 2 элементами; выбранный ключ в качестве первого элемента и весь исходного элемента в качестве второго элемента, это называется запись (напр. , запись массива , Записи на карте ). А вот официальный документ с примером, показывающим, как добавить записи массива в конструкторе Map.
Пример , когда ключ место :
[["here", {place: "here", name: "x", other: "other stuff1" }], ...]
Во-вторых, мы передаем этот модифицированный массив конструктору Map, и здесь происходит волшебство. Карта удалит дублирующиеся значения ключей, сохраняя только последнее вставленное значение того же ключа.
Примечание . Карта сохраняет порядок вставки. ( проверьте разницу между картой и объектом )
новая карта (входной массив только что отображен выше)
В-третьих, мы используем значения карты для извлечения оригинальных элементов, но на этот раз без дубликатов.
новая карта (mappedArr) .values ()
И последнее - добавить эти значения в новый новый массив, чтобы он мог выглядеть как исходная структура и вернуть это:
return [... new Map (mappedArr) .values ()]