Как уникализировать массив объектов по значениям нескольких свойств?

Есть массив:

const arr = [
  { model: '001', param1: 'a1', param2: 'a2', paramN: 'aN' },
  { model: '001', param1: 'b1', param2: 'a2', paramN: 'bN' },
  { model: '001', param1: 'a1', param2: 'a2', paramN: 'cN' },
  { model: '002', param1: 'c1', param2: 'b2', paramN: 'dN' }
];

Нужно получить новый массив, в который войдут те элементы старого, значения определенных ключей которых - уникальны. Т.е. отсеиваться должны не полностью одинаковые объекты, а только те, в которых значения определенных ключей одинаковы. Например, в приведенном примере объект с индексом 2 не должен попасть в итоговый массив, поскольку первые три его ключа имеют те же значения, что и аналогичные в нулевом объекте. А элемент с индексом 1 - попадает в итоговый массив, потому что его param1 имеет отличающееся значение. Ну и с индексом 3 - тем более попадает.
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const unique = (arr, keys) =>
  arr.filter(n => n === arr.find(m => keys.every(k => m[k] === n[k])));


const result = unique(arr, [ 'model', 'param1', 'param2' ]);

или

const unique = (arr, keys) =>
  arr.filter(function(n) {
    const picked = keys(n).reduce((acc, k) => acc.set(k, acc.get(k) || new Map).get(k), this[0]);
    return !picked.set(this[1], picked.has(this[1])).get(this[1]);
  }, [ new Map, Symbol() ]);


const result = unique(arr, n => [ n.model, n.param1, n.param2 ]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
NeiroNx
@NeiroNx
Программист
const arr = [
  { model: '001', param1: 'a1', param2: 'a2', paramN: 'aN' },
  { model: '001', param1: 'b1', param2: 'a2', paramN: 'bN' },
  { model: '001', param1: 'a1', param2: 'a2', paramN: 'cN' },
  { model: '002', param1: 'c1', param2: 'b2', paramN: 'dN' }
];
var param1=[],param2=[];
var _arr=arr.filter(function(e){return !param1.includes(e.param1)&&!param2.includes(e.param2)&&param1.push(e.param1)&&param2.push(e.param2)});
[
{model: "001", param1: "a1", param2: "a2", paramN: "aN"},
{model: "002", param1: "c1", param2: "b2", paramN: "dN"}
]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы