подчеркивание или lazy.js карта (0,1,2,3,4) (1,2,3,4,5) ->(1,3,5,7,9)

#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, поэтому не является общим решением.