2016-10-31 3 views
5

Я хочу написать reduce самостоятельно. Но за последние 4 часа я не мог.Как написать собственную функцию `reduce`?

var a = [10, 21, 13, 56]; 

function add(a, b) { return a + b } 
function foo(a, b) { return a.concat(b) } 

Array.prototype.reduce2 = function() { 
    // I do not understand how to handle the function of the inlet 
    // I know that I should use arguments, but I don't know how many arguments there will be 
    var result = 0; 
    for(var i = 0; i < arguments.length; i++) { 
    result += arguments[i]; 
    } 
return result; 
}; 

console.log(a.reduce(add), a.reduce2(add))   // 100 100 
console.log(a.reduce(add, 10), a.reduce2(add, 10)) // 110 110 

Да, я знаю, что это похоже на множество тем, но я не мог найти ответ. Что мне не хватает или что-то не так?

+3

Вам не нужно использовать 'arguments' - объявить их в явном виде' функции (редуктор , initialValue) ' – zerkms

+3

Вы просмотрели [Polyfill on MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill)? Это должно дать вам несколько советов – UnholySheep

ответ

0

на основе кода

var a = [10, 21, 13, 56]; 
 

 
function add(a, b) { return a + b } 
 
function foo(a, b) { return a.concat(b) } 
 

 
Array.prototype.reduce2 = function(fn, start){ 
 
    var result = start !== undefined ? start : this[0]; 
 
    for (var i = 0; i < this.length; i++) { 
 
    result = fn(result, this[i]); 
 
    } 
 
    return result; 
 
}; 
 
console.log(a.reduce(add), a.reduce2(add))   // 100 100 
 
console.log(a.reduce(add, 10), a.reduce2(add, 10)) // 110 110 
 
console.log(a.reduce(foo, ''), a.reduce2(foo, '')); 
 
console.log(a.reduce(foo, 'X'), a.reduce2(foo, 'X'));

+0

Вы пытались передать 'foo' вместо' add'? – trincot

+0

Нет, я не сделал этого, но теперь знаю. Спасибо, «> Вам также нужно различать наличие или отсутствие начального значения» помогает мне понять, что я пропустил. – Robiseb

+0

Есть еще проблемы. Когда вы их решаете, ваш код не будет сильно отличаться от моего ответа. Например, попробуйте передать непустую строку в качестве стартового значения для 'foo'. ;-) – trincot

5

Массив в теме не передается в качестве аргумента, но контекст (this).

Кроме того, необходимо различать наличие или отсутствие начального значения:

var a = [10, 21, 13, 56]; 
 

 
function add(a, b) { return a + b } 
 
function foo(a, b) { return a.concat(b) } 
 

 
Array.prototype.reduce2 = function (f, result) { 
 
    var i = 0; 
 
    if (arguments.length < 2) { 
 
    i = 1; 
 
    result = this[0]; 
 
    } 
 
    for(; i < this.length; i++) { 
 
    result = f(result, this[i], i, this); 
 
    } 
 
    return result; 
 
}; 
 
console.log(a.reduce(add), a.reduce2(add))   // 100 100 
 
console.log(a.reduce(add, 10), a.reduce2(add, 10)) // 110 110 
 
// extra test with foo: 
 
console.log(a.reduce(foo, 'X'), a.reduce2(foo, 'X')) // X10211356 X10211356

Смежные вопросы