Кроме того, что "преобразование является более мощной альтернативой для сокращения", я не могу найти документацию о том, что такое различия. Каковы различия между преобразованием и уменьшением в lodash (кроме того, что он на 25% медленнее)?
Какая разница между преобразованием и уменьшением в lodash
Ответ 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
преобразует работы на объекты, уменьшает не