2016-04-16 7 views
5

पर फ़ंक्शन तर्क पास करें कहें कि मेरे पास किसी ऑब्जेक्ट को अन्य ऑब्जेक्ट्स से लिखने के लिए एक फ़ंक्शन है, और मैं फ़ंक्शन में तर्क पारित कर रहा हूं - शुरुआत में एक ऑब्जेक्ट शाब्दिक, और तब ऑब्जेक्ट्स जिसे मैं ऑब्जेक्ट को हद तक लिखना चाहता हूं:ऑब्जेक्ट.साइन

composeFunc({}, obj1, obj2, obj3); 

पारित कर दिया आर्ग की संख्या वैकल्पिक है, कैसे मैं तो 2 आर्ग पर शुरू Object.assign() को आर्ग पारित है।

function composeObj(objs) { 
    return Object.assign(arguments[1], arguments[2], arguments[3]... etc); 
} 

अग्रिम :)

+0

आप पहले ही तर्क से पारित तर्कों की एक सरणी के रूप में दूसरे से तर्क पारित कर चुके हैं; – itzmukeshy7

+1

@ itzmukeshy7: यह एक सरणी नहीं है, बस सरणी की तरह (जो प्रश्न के लिए प्रासंगिक है)। लेकिन मुझे लगता है कि उदाहरण सिर्फ उस अवधारणा को दिखाने के लिए था जो वे करना चाहते थे। मुद्दा यह है कि तर्कों की संख्या परिवर्तनीय है। –

+0

@ ले-मोई 'तर्क' एक विशेष सरणी है जिसमें सभी पास किए गए तर्क हैं; – itzmukeshy7

उत्तर

5

धन्यवाद आप केवल एक परत से ES2015 का उपयोग कर रहे हैं, तो आप प्रसार अंकन, Array.from, और slice उपयोग कर सकते हैं:: तो समारोह निम्नलिखित जैसे लगते हैं

function composeObj(objs) { 
    return Object.assign(...Array.from(arguments).slice(1)); 
} 

या बस का उपयोग कर slice सीधे बजाय Array.from के बाद:

function composeObj(objs) { 
    return Object.assign(...Array.prototype.slice.call(arguments, 1)); 
} 

... Thomas' answer बाकी तर्कों का उपयोग करके देखें, क्योंकि यह ES2015 में ऐसा करने का सही तरीका है।

function composeObj(objs) { 
    return Object.assign.apply(Object, Array.prototype.slice.call(arguments, 1)); 
} 

वहाँ, हम प्रसार ऑपरेटर के बजाय Function#apply उपयोग कर रहे हैं (ES5 और पहले के बाद से:

आप ES2015 उपयोग नहीं कर रहे हैं, तो आप एक ही बात apply के माध्यम से सिर्फ एक shimmed Object.assign साथ कर सकते हैं स्प्रेड ऑपरेटर नहीं है)। Function#apply उस कॉल को कॉल करता है जिसे आप कॉल के दौरान this के रूप में पहले तर्क का उपयोग करते हुए कॉल करते हैं, और सरणी (या सरणी जैसी चीज़) का उपयोग करके आप इसे कॉल के तर्क के रूप में दूसरे तर्क के रूप में देते हैं।

तो कहते हैं कि तुम है:

obj.foo(1, 2, 3); 

Function#apply का उपयोग कर के बराबर है:

obj.foo.apply(obj, [1, 2, 3]); 

पहला तर्क, obj, बताता है apply क्या कॉल के दौरान this के रूप में उपयोग करने के लिए। दूसरा तर्क उपयोग करने के लिए तर्कों की एक सरणी है।

लेकिन यदि आप स्प्रेड ऑपरेटर का उपयोग करते हैं, तो इसकी कोई ज़रूरत नहीं है, यह अलग-अलग तर्कों में अपने सरणी जैसे ऑपरेंड को फैलाता है।

+0

बिंगो, धन्यवाद टीजे। यदि आप कोई फर्क नहीं पड़ता है, तो क्या आप जा रहे हैं के माध्यम से मुझसे बात कर सकते हैं? हम ऑब्जेक्ट.साइन() पर क्यों लागू करते हैं? ऑब्जेक्ट का पहला तर्क क्यों लागू होता है? मेरे सिर में काम करने की कोशिश कर रहा है - क्या लागू किया गया तर्कों से निपटने के लिए उपयोग किया जाता है क्योंकि उन्हें एक ऐरे में परिवर्तित किया जाता है? –

+0

@LeMoi: मैंने इसे समझाने के अंत में जोड़ा है, लेकिन यदि आप ES2015 से स्प्रेड ऑपरेटर का उपयोग कर रहे हैं, तो आपको 'आवेदन' का उपयोग करने की आवश्यकता नहीं है। –

+0

बहुत बहुत धन्यवाद, यह शानदार है :) –

2

ES2015:

function composeObj(objs, ...rest){ 
    return Object.assign(...rest); 
} 

rest तर्क दूसरा एक से शुरू के सभी के एक सच्चे सरणी हो जाएगा।

और कोलाहल-आउटपुट:

function composeObj(objs) { 
    for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 
    rest[_key - 1] = arguments[_key]; 
    } 

    return Object.assign.apply(Object, rest); 
} 

यह एक उपयोगिता-समारोह है कि हर जगह इस्तेमाल किया जा सकता हो रहा है। जैसे ही आप arguments को Array.prototype.slice() या Array.from(), composeObj जैसे किसी अन्य फ़ंक्शन को पास करते हैं, जेएस-कंपाइलर द्वारा अब अनुकूलित नहीं किया जाएगा। तो, ऐसा मत करो।

टीजे पर सबकुछ पहले से ही कहा जा चुका है। भीड़ जवाब और टिप्पणियां; बस बेहतर कार्यान्वयन दिखा रहा है।

+0

यदि ओपी ES2015 का उपयोग कर रहा है, तो यह स्वीकार्य उत्तर होना चाहिए, और इसी तरह की समस्या के साथ ES2015 का उपयोग करने वाले किसी भी व्यक्ति को इस सलाह का पालन करना चाहिए। (मेरा सिर कहां था?) –

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

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