2016-03-10 16 views
9

मै मैप() के व्यवहार से काफी उलझन में हूं।क्यों सरणी पर एक जेएस नक्शा मूल सरणी को संशोधित करता है?

मैं इस तरह की वस्तुओं की एक सरणी है:

const products = [{ 
    ..., 
    'productType' = 'premium', 
    ... 
}, ...] 

और मैं एक समारोह है कि एक ही सरणी लौट जाना करने के लिए, लेकिन सभी उत्पाद के साथ इस सरणी गुजर रहा हूँ बना मुक्त:

[{ 
    ..., 
    'productType' = 'free', 
    ... 
}, ...] 

कार्य है:

const freeProduct = function(products){ 
    return products.map(x => x.productType = "free") 
} 

जो निम्न सरणी देता है:

["free", "free", ...] 

तो मैं अपने समारोह दुबारा लिखा होने के लिए:

const freeProduct = function(products){ 
    return products.map(x => {x.productType = "free"; return x}) 
} 

कौन सा सरणी देता है के रूप में इरादा।

लेकिन! और यही वह क्षण है जहां मैंने अपना दिमाग खोला, दोनों मामलों में मेरे मूल उत्पाद सरणी को संशोधित किया गया है।

मानचित्र के आसपास दस्तावेज़ीकरण() कहता है कि यह नहीं होना चाहिए (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)।

मैं भी इस

const freeProduct = function(products){ 
    p = products.splice() 
    return p.map(x => {x.productType = "free"; return x}) 
} 

की तरह मेरे समारोह मोड़ मेरी सरणी का क्लोन बनाने की कोशिश की लेकिन मैं अभी भी एक ही परिणाम (जो मुझे पागल ड्राइव करने के लिए शुरू होता है) मिलता है।

मैं किसी के भी बहुत आभारी हूं जो मुझे समझा सकता है कि मैं क्या गलत कर रहा हूं!

धन्यवाद

उत्तर

26

आप अपनी मूल सरणी को संशोधित नहीं कर रहे हैं। आप सरणी में वस्तुओं को संशोधित कर रहे हैं। आप अपने सरणी में वस्तुओं परिवर्तनशील से बचना चाहते हैं, तो आप मूल के गुणों के साथ साथ किसी भी परिवर्तन की जरूरत के साथ एक नई वस्तु बनाने के लिए Object.assign उपयोग कर सकते हैं:

const freeProduct = function(products) { 
    return products.map(x => { 
    return Object.assign({}, x, { 
     productType: "free" 
    }); 
    }); 
}; 
+0

हाय। उपरोक्त कोड में "=>" का क्या अर्थ है? –

+1

@ हरशाकंचिना ईएस 6 में जोड़ा गया वसा तीर फ़ंक्शन सिंटैक्स है। [यहां] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Arrow_functions) एमडीएन पर इसके बारे में कुछ जानकारी है। – SimpleJ

+0

जावास्क्रिप्ट एक कार्यात्मक भाषा होने का नाटक करता है, लेकिन क्लास कीवर्ड की तरह ही, यह भ्रमित, अनजान और बहुत समय बर्बाद कर रहा है। 'आप अपनी मूल सरणी को संशोधित नहीं कर रहे हैं। आप सरणी में ऑब्जेक्ट्स को संशोधित कर रहे हैं '- हालांकि यह उत्तर सही है यह अजीब है क्योंकि असली दुनिया में आप कुछ हिस्सों को नहीं बदल सकते हैं और यह वही रहता है। – Cobolt

8

SimpleJ के जवाब पर विस्तार से बता दें - अगर आप == के लिए गए थे = दो सरणी, आप पाएंगे कि वे बराबर नहीं होंगे (स्मृति में एक ही पता नहीं) यह पुष्टि करते हुए कि मैप किए गए सरणी वास्तव में एक नई सरणी है। मुद्दा यह है कि आप एक नई सरणी लौट रहे हैं, जो कि मूल सरणी में समान वस्तुओं के संदर्भों से भरा है (यह नए ऑब्जेक्ट अक्षरों को वापस नहीं कर रहा है, यह उसी ऑब्जेक्ट पर संदर्भ लौटा रहा है)। इसलिए आपको नई वस्तुओं को बनाने की ज़रूरत है जो पुराने ऑब्जेक्ट्स की प्रतियां हैं - यानी, SimpleJ द्वारा दिए गए ऑब्जेक्ट.साइन उदाहरण w/w।

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