2015-02-25 2 views
0

Я пытаюсь использовать функцию underscore.js each, чтобы нажимать каждый элемент массива на существующий массив на месте.Вызов подчеркивания каждого (_.each) по методу объекта

Чтобы сделать это, я предполагал, что я мог бы использовать методpush массив , а не обычный анонимной функции передается each, при условии, что я передал объект контекста в качестве 3-го аргумента each:

> var a = [1,2,3] 
> var b = [] 
> _.each(a, b.push, b) 

Я бы ожидать b к теперь будет [1,2,3], но это на самом деле:

Array [ 1, 0, Array[3], 2, 1, Array[3], 3, 2, Array[3] ] 

Что происходит?

ответ

0

_.each не работает так же, как foreach во многих других языках функционального программирования или библиотеках. Как описано в documentation,

Каждый вызов iteratee вызывается с тремя аргументами: (элемент, индекс, список)

Если вы вместо того, чтобы использовать console методы, вы можете увидеть это:

> _.each(a, console.log, console) 

    1 0 Array [ 1, 2, 3 ] 
    2 1 Array [ 1, 2, 3 ] 
    3 2 Array [ 1, 2, 3 ] 

поэтому push в конечном итоге принимает эти девять значений, а не те, на которые можно надеяться. Можно просто использовать анонимную функцию:

_.each(a, function(x) { b.push(x) }) 

и b затем [1,2,3], как и ожидалось.

Или, в этом конкретном случае, используйте один из других способов: extend an array in JavaScript.