Loda sh uniq С помощью функции компаратора изменить свойства объекта - PullRequest
0 голосов
/ 11 июля 2020

Я хочу изменить каждый объект в массиве, а также удалить дубликаты. Я уже использую loda sh uniqWith для сравнения элементов, поэтому я решил, что сделаю несколько других logi c в функции компаратора, чтобы изменить каждый элемент, чтобы я мог избежать установки другого l oop. Есть ли проблемы с дополнительными логами c в компараторе, как показано ниже?

import uniqWith from 'lodash/uniqWith';

const transformedArray = uniqWith(
    arrayOfObjects,
    (currObject, otherObject): boolean => {

        // modifying current object's properties, is this legit??

        if (<someCondition>) {
            currObject.someProperty = true;
        }

        // actual comparison logic

        if (currObject.uuid === otherObject.uuid) {
            return true;
        }
        return false;
    },
);

Ответы [ 3 ]

1 голос
/ 16 июля 2020

В документации uniqWith о вызове обратного вызова говорится только следующее:

Компаратор вызывается с двумя аргументами: (arrVal, othVal) .

Я лично не стал бы использовать функцию сравнения uniqWith для итерационной работы. В документации не указано, как часто и в каком порядке будет вызываться функция сравнения. Скажем, у вас есть массив [1,2,3]. Я бы предположил, что каждый элемент сравнивается со всеми элементами на выходе, чтобы проверить уникальность. Реализация может выглядеть примерно так:

function uniqWith(array, compareFn) {
  const unique = [];
  for (const current of array) {
    const isDuplicate = unique.some(other => compareFn(current, other));
    if (!isDuplicate) unique.push(current);
  }
  return unique;
}

Если это действительно так, это означает, что обратный вызов никогда не вызывается для 1, один раз для 2 и дважды для 3.

Вообще говоря, не используйте функции обратного вызова для выполнения итераций, если только функция, принимающая обратный вызов, не сообщает, когда / как часто / в каком порядке и c. эта функция вызывается.

Возьмем, к примеру, метод Array forEach. Документация раскрывает все эти вещи.

forEach() вызывает предоставленную callback функцию один раз для каждого элемента в массиве в порядке возрастания. Он не вызывается для свойств индекса, которые были удалены или не инициализированы. (Для разреженных массивов см. Пример ниже .)

0 голосов
/ 16 июля 2020

После более тщательного тестирования я понял, что в lodash/uniqWith есть некоторая оптимизация, при которой не каждый элемент обязательно передается в функцию компаратора как currObject. Что касается моего примера кода в исходном вопросе, не гарантируется, что каждый элемент в массиве получит .someProperty = true. Надо было еще протестировать это перед публикацией, но все же ценю отзывы.

0 голосов
/ 11 июля 2020

Краткий ответ: нет, если под «неправильным» вы подразумеваете критическую проблему.

Средний ответ: Это не должно мешать работе метода. Просто имейте в виду, что выполнение мутаций в уникальных местах, где вы иначе не можете их ожидать, обменивает ясность на краткость , что может привести к путанице и устранению кошмаров позже, если вы потерять их из виду.

...