#javascript #node.js #functional-programming #underscore.js #lazy-evaluation
#javascript #node.js #функциональное программирование #underscore.js #ленивая оценка
Вопрос:
Я хочу сопоставить последовательность с другой последовательностью, такой как
карта (0,1,2,3,4) (1,2,3,4,5) -> (1,3,5,7,9)
Как это сделать в lazy.js или подчеркивание ?
Спасибо!
Ответ №1:
Вы можете использовать _.zip
и _.map
, например, так
var _ = require("underscore");
function sum(numbers) {
var result = 0;
for (var i = 0; i < numbers.length; i = 1) {
result = numbers[i];
}
return resu<
}
console.log(_.map(_.zip([0, 1, 2, 3, 4], [1, 2, 3, 4, 5]), sum))
// [ 1, 3, 5, 7, 9 ]
Поскольку всегда будет только два числа, вы можете упростить это следующим образом
var result = _.chain([0, 1, 2, 3, 4])
.zip([1, 2, 3, 4, 5])
.map(function(numbers) {
return numbers[0] numbers[1];
})
.value();
console.log(result);
Вы можете сделать его немного более общим и чистым, например
function sum(numbers) {
return numbers.reduce(function(result, current) {
return result current;
}, 0);
}
var result = _.chain([0, 1, 2, 3, 4])
.zip([1, 2, 3, 4, 5])
.map(sum)
.value();
Или даже проще, как в первом ответе
console.log(_.map(_.zip([0, 1, 2, 3, 4], [1, 2, 3, 4, 5]), sum));
Комментарии:
1. Спасибо. Я думаю, что использование цикла for в функциональном программировании не очень хорошо.
2. @KenOKABE Я могу добавить
reduce
и сделать его «функциональным», если хотите 😉3. @KenOKABE Хорошо, я добавил еще один способ сделать это. Пожалуйста, проверьте 🙂
Ответ №2:
Используя подчеркивание, решение @thefortheye работает хорошо, вот аналогичное решение, просто использующее lazy.js вместо этого;
> var Lazy = require('lazy.js');
> var addParts = function(x) { return Lazy(x).sum(); }
> Lazy([0,1,2,3,4]).zip([1,2,3,4,5]).map(addParts).toArray()
[ 1, 3, 5, 7, 9 ]
Ответ №3:
Приведенный выше пример может быть выполнен следующим образом с использованием подчеркивания:
_.map([0, 1, 2, 3, 4], function(n, i) {
return n i 1
}) // This returns [1, 3, 5, 7, 9]
Вот ссылка на документы API: Подчеркивание#map
Комментарии:
1. Спасибо. Этот метод работает, только вторая последовательность связана с первой, как n i 1, поэтому не является общим решением.