Как получить уникальные значения на основе нескольких столбцов из массива в Angular 5? - PullRequest
3 голосов
/ 11 июля 2019

У меня есть массив, похожий на

[{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }]

, в котором требуется уникальная комбинация X & Y.

Вывод:

[{ 's':1,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }]

С X & Yзначения одинаковы в 1-м и 2-м элементе.Необходимо удалить 1.

Для UniqBy Single column я использую

_.uniqBy([{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }], 'y');

Но мне нужно сочетание 2 или более клавиш.

_.uniqBy([{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }], '[x]','[y]'); 

имного.Никто из них не работал /

[{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y

_.uniqBy([{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }], 'y');



[{ 's':1,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }]

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Используйте filter и findIndex для чрезвычайно простого ванильного решения JavaScript (все, что делается в Lodash, может быть сделано в JavaScript, Lodash просто упрощает вещи):

const arr = [{'s':1,'x':1,'y':1},{'s':2,'x':1,'y':1},{'s':3,'x':1,'y':2},{'s':4,'x':2,'y':1},{'s':5,'x':2,'y':2}];

const res = arr.findIndex(({ x, y }, i, a) => i == a.findIndex(e => e.x == x && e.y == y));

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Решения Lodash:

Использование _.uniqBy сравнения двух полей в виде строки значений через запятую:

const arr = [{'s':1,'x':1,'y':1},{'s':2,'x':1,'y':1},{'s':3,'x':1,'y':2},{'s':4,'x':2,'y':1},{'s':5,'x':2,'y':2}];

const res = _.uniqBy(arr, ({ x, y }) => `${x}${y}`);

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

Использование _.uniqWith:

const arr = [{'s':1,'x':1,'y':1},{'s':2,'x':1,'y':1},{'s':3,'x':1,'y':2},{'s':4,'x':2,'y':1},{'s':5,'x':2,'y':2}];

const res = _.uniqWith(arr, ({ x, y }, { x: x1, y: y1 }) => x == x1 && y == y1);

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 11 июля 2019

Вы можете использовать функцию обратного вызова и объединить числа.

console.log(_.uniqBy([
   { 's':1,'x': 1,'y':1 },
   { 's':2,'x': 1,'y':1 },
   { 's':3,'x': 1,'y':2 },
   { 's':4,'x': 2,'y':1 },
   { 's':5,'x': 2,'y':2 }
], el => `${el.x}${el.y}`)); 
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.14/lodash.min.js"></script>
...