Подтвердить что ты не робот

Какая разница между преобразованием и уменьшением в lodash

Кроме того, что "преобразование является более мощной альтернативой для сокращения", я не могу найти документацию о том, что такое различия. Каковы различия между преобразованием и уменьшением в lodash (кроме того, что он на 25% медленнее)?

4b9b3361

Ответ 1

Мне нравится погружаться в исходный код, прежде чем я вложу утилиты. Для lo-dash это может быть затруднено, поскольку во всех утилитах есть тонна абстрактных внутренних функций.

Таким образом, очевидные различия заключаются в следующем:

  • Если вы не указали накопитель (обычно называемый запиской если вы привыкли подчеркивать), _.transform будет гадать, если вы хотите массив или объект, в то время как сокращение приведет к тому, что аккумулятор станет начальным элементом коллекции.

Пример: массив или карта объекта через transform:

_.transform([1, 2, 3], function(memo, val, idx) {
    memo[idx] = val + 5;
});
// => [6, 7, 8]

По сравнению с уменьшением (обратите внимание, что вы должны знать тип ввода!)

_.reduce([1, 2, 3], function(memo, val, idx) {
    memo[idx] = val + 5;
    return memo;
}, []);

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

var sum = _.reduce([1, 2, 3, 4], function(a, b) {
    return a + b;
});
  • Еще одно большое различие заключается в том, что вам не нужно возвращать аккумулятор с помощью transform, и аккумулятор не может изменить значение (т.е. он всегда будет одним и тем же массивом). Я бы сказал, что это самое большое преимущество функции, поскольку я часто забыл вернуть аккумулятор с помощью сокращения.

Например, если вы хотите преобразовать массив в словарь значений с уменьшением, вы должны написать код следующим образом:

_.reduce([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
   return memo;
}, {});

В то время как с преобразованием мы можем написать это очень красиво, без необходимости возвращать аккумулятор, как в уменьшении

_.transform([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
}, {});
  • Еще одно отличие: мы можем выйти из итерации преобразования, вернув false.

В целом, я бы сказал, что сокращение - более гибкий метод, так как у вас больше контроля над аккумулятором, но преобразование можно использовать для написания эквивалентного кода для некоторых случаев в более простом стиле.

Ответ 2

преобразует работы на объекты, уменьшает не