Безопасно ли использовать нечистый редуктор в Array.prototype.reduce? - PullRequest
1 голос
/ 26 апреля 2019

Мне было интересно, безопасно ли использовать нечистый редуктор в array.prototype.reduce в javascript.

Пример:

Допустим, у меня есть следующий массив:

[{ id: 0, value: 6 }, { id: 1, value: 25 }]

Если бы я хотел преобразовать это в карту, где идентификатор стал ключом, а значение - значением.

У меня есть два варианта: с чистым редуктором и нечистым.

// pure option
const data = [{ id: 0, value: 6 }, { id: 1, value: 25 }];
const object = data.reduce((accum, { id, value }) =>
  Object.assign({}, accum, { [id]: value }), 
  {}
);
const map = new Map(Object.entries(object));
// impure option
const data = [{ id: 0, value: 6 }, { id: 1, value: 25 }];
const map = data.reduce(
  (accum, { id, value }) => accum.set(id, value),
  new Map()
);

Несмотря на то, что нечистый вариант намного быстрее и содержит меньше стандартного кода, я не уверен, безопасен ли он или может ли он дать условия гонки.

1 Ответ

1 голос
/ 26 апреля 2019

Ты слишком обдумываешь это.

Это нормально, многие из нас (включая меня) оказываются там.Но задайте себе этот вопрос: с точки зрения лица, использующего вашу Карту, вы можете сказать разницу?Ответ: нет.На самом деле, достаточно умный компилятор превратит первое в второе.Хотя я обычно стараюсь не быть человеком-компилятором при написании кода, в этом случае нечистая версия становится короче и , чище и быстрее.

Local состояние в Javascript равно отлично .

Нельзя сказать, что что-нибудь идет, я бы не мутировал внешнюю структуру данных внутри редуктора (или влюбая другая функция в этом отношении), но мутирование той, которая не «просачивается» за пределы вызова для сокращения и создается исключительно для цели конструирования таким образом, прекрасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...