Lodash Uniq, как, скажем, Lodash сохранить последний дубликат - PullRequest
2 голосов
/ 29 мая 2019

Здравствуйте, я использую метод lodash uniqWith для удаления дублированных элементов, которые имеют одинаковый идентификатор в моем массиве.

но lodash сохранит первый дублированный предмет.Но я не хочу хранить последний дублированный элемент.

что я могу для этого сделать?

var result = _.uniqWith(editedData, function(arrVal, othVal) {
      return arrVal.id === othVal.id;
    });
    console.log(result)

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Вы можете создать функцию uniqByLast, используя _.flow(). Используйте _.keyBy(), чтобы получить объект по id, и _.values(), чтобы получить массив:

const { flow, partialRight: pr, keyBy, values } = _

const lastUniqBy = iteratee => flow(
  pr(keyBy, iteratee),
  values
)

const arr = [{ id: 1, val: 1 }, { id: 1, val: 2 }, { id: 2, val: 1 }, { id: 2, val: 2 }]

const result = lastUniqBy('id')(arr)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И та же идея, используя lodash / fp:

const { flow, keyBy, values } = _

const lastUniqBy = iteratee => flow(
  keyBy(iteratee),
  values
)

const arr = [{ id: 1, val: 1 }, { id: 1, val: 2 }, { id: 2, val: 1 }, { id: 2, val: 2 }]

const result = lastUniqBy('id')(arr)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
1 голос
/ 29 мая 2019

Самый простой способ? Сначала обратный массив (после клонирования, чтобы избежать мутации).

var result = _.uniqWith(_.reverse(_.clone(editedData)), function(arrVal, othVal) {...});

Вы также можете упростить свой код:

var result = _.uniqWith(_.reverse(_.clone(editedData)), ({ id: a }, { id: b }) => a === b);
...