2016-10-31 4 views
5

मैं अपने आप से reduce लिखना चाहता हूं। लेकिन पिछले 4 घंटों में, मैं नहीं कर सका।मैं अपना खुद का 'कम करें' फ़ंक्शन कैसे लिखूं?

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' की जरूरत नहीं है:

तुम भी उपस्थिति या शुरू मूल्य के अभाव के बीच अंतर करने की जरूरत है , प्रारंभिक वैल्यू) ' – zerkms

+3

क्या आपने [एमडीएन पर पॉलीफिल] (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

क्या आपने 'add' के बजाय 'foo' पास करने का प्रयास किया है? – 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

संबंधित मुद्दे