2016-03-14 13 views
7

Array.from से Array.prototype.map को पास करने का प्रयास करते समय मुझे एक अजीब त्रुटि मिल रही है।ऐरे। TypeError से: 0 कोई फ़ंक्शन नहीं है

let fn = Array.from.bind(Array); // [Function: bound from] 

fn('test') // [ 't', 'e', 's', 't' ] 

['test'].map(s => fn(s)) // [ [ 't', 'e', 's', 't' ] ] 

['test'].map(fn) // TypeError: 0 is not a function 

पूर्ण त्रुटि:

TypeError: 0 is not a function 
    at Function.from (native) 
    at Array.map (native) 
    at repl:1:10 
    at REPLServer.defaultEval (repl.js:260:27) 
    at bound (domain.js:287:14) 
    at REPLServer.runBound [as eval] (domain.js:300:12) 
    at REPLServer.<anonymous> (repl.js:429:12) 
    at emitOne (events.js:95:20) 
    at REPLServer.emit (events.js:182:7) 
    at REPLServer.Interface._onLine (readline.js:211:10) 

क्या हो रहा है?

उत्तर

9

map तीन तर्कों के साथ कॉलबैक कॉल करता है: प्रविष्टि, अनुक्रमणिका, और ऑब्जेक्ट को फिर से चालू किया जा रहा है। Array.from उम्मीद करता है कि यदि कोई दूसरा तर्क दिया जाता है, तो यह एक मैपिंग फ़ंक्शन है, और इसलिए इसे प्रत्येक "तत्व" पर कॉल करने का प्रयास करता है, जिससे यह सरणी बना रहा है। पहली कॉल पर इंडेक्स, 0, कोई फ़ंक्शन नहीं है, इसलिए Array.from विफल रहता है।

यह एक और तरीका है,

['test'].map(fn) 

के बराबर रखो

['test'].map(e => fn(e)) 

बल्कि

['test'].map((e, i, a) => fn(e, i, a)) 

... जहां e प्रविष्टि है नहीं है, i अपने सूचकांक है , और aद्वारा "सरणी" को घुमाया जा रहा है। चूंकि i कोई फ़ंक्शन नहीं है, Array.from विफल रहता है।

आप कई अन्य सरणी काम करता है, इस तरह के रूप forEach, some साथ बात की इसी तरह मिलता है, ...


आप इस एक बहुत करते हैं, आप इसे उपयोगी एक समारोह के लिए मिल सकता है आप

function passOneArg(f) { 
    return function(a) { return f.call(this, a); }; 
} 

जो आप इस तरह उपयोग कर सकते हैं:

['test'].map(passOneArg(fn)) 
लेकिन पहला तर्क सभी फिल्टर करने के लिए उपयोग कर सकते हैं

या संभावित रूप से

function limitArgs(f, count) { 
    return function() { 
     return f.apply(this, Array.prototype.slice.call(arguments, 0, count)); 
    }; 
} 

तो

['test'].map(limitArgs(fn, 1)) 

उन कर रहे हैं, ज़ाहिर है, इस ग्रह पर सबसे खराब समारोह नामों में से दो, लेकिन आप अंदाजा हो ... :-)

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