2014-04-24 10 views
9

मेरे पास एक फ़ंक्शन, message है जो संदेश के प्रकार को परिभाषित करने के लिए एक पैरा लेता है और फिर यह संदेश बनाने के लिए किसी भी अन्य तर्क में शामिल होता है, पूरी तरह से एक nicety।तर्कों के लिए तर्क तैयार करें तो

यह इस तरह दिखता है:

function message(type) { 
    var msg = _.rest(arguments).join(" "); 

    // Really the type will be used to set the class on a div 
    // But I'm just using console.log to keep it simple for now. 
    console.log(type + ": " + msg); 
} 

मैं सहायक काम करता है, error, warning, info, जो केवल सही प्रकार के साथ message फोन उपलब्ध कराना चाहते हैं। मैं इस बारे में जाने का सबसे अच्छा तरीका बिल्कुल अनिश्चित हूं। मैं दो तरीकों से नहीं सोच सकता लेकिन मुझे यकीन नहीं है कि मैं इसके बारे में सही तरीके से जा रहा हूं या शायद मैं चीजों को खत्म कर रहा हूं।

पहला तरीका थोड़ा अनावश्यक लगता है, पहला तर्क युक्त एक नया सरणी बनाएं और तर्क तब इसे फ़्लैट करें।

message.apply(this, _.flatten(["error", arguments])); 

दूसरा तरीका थोड़ा सा महसूस करता है ... गन्दा?

Array.prototype.unshift.call(arguments, "error"); 
message.apply(this, arguments); 

हालांकि मेरी experiement से:

(function() { 
    Array.prototype.unshift.call(arguments, 0); 
    console,log(arguments); 
})(1, 2, 3); 

मैं निम्नलिखित उत्पादन प्राप्त करें:

[0, 1, 2, 3, undefined, undefined, undefined, ..., undefined] 

उत्तर

8
var args = Array.prototype.slice.call(arguments); // Make real array from arguments 
args.unshift("error"); 
message.apply(this, args); 

देखें How can I convert the "arguments" object to an array in JavaScript?

+0

बनाने के लिए .call का उपयोग करना चाहिए यह हर जगह काम वर आर्ग = Array.prototype.slice .call (तर्क); – Dan

5

ES5 में इस की तुलना में थोड़ा और अधिक कुशल हो सकता है converti पहले कोई वास्तविक सरणी के लिए एनजी और फिर unshift:

var args = Array.prototype.concat.apply(["error"], arguments); 
message.apply(this, args); 

संपादित करें: बेहतर इनपुट सरणियों सपाट से बचने के लिए:

var args = ["error"]; 
args.push.apply(args, arguments); 
message.apply(this, args); 
+1

इसका उपयोग करके सावधान रहें, जैसे कि 'तर्क' के तत्व सरणी हैं, वे तत्व के रूप में जोड़े जाने के बजाय सरणी में 'flattened' हो जाएंगे। जैसे 'var args = Array.prototype.concat.apply ([" error "], [" सेब "," केला ", [" गाजर "," चेरी "]]) गलत तरीके से 'args = [" त्रुटि "बन जाता है, "सेब", "केले", "गाजर", "चेरी"] '। – samthecodingman

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