2015-11-02 4 views
9

के लिए सरणी के अंदर ऑब्जेक्ट को बदलता है, मैं प्रत्येक लूप के लिए वर्तमान ऑब्जेक्ट को बदलना चाहता हूं और यह काम नहीं करता है, यह क्यों काम नहीं कर रहा है और मैं यह कैसे कर सकता हूं?जेएस प्रत्येक लूप

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item) { 
    item = {somethingElse: 1} 
}); 

console.log(arr); 
+0

मेरा मानना ​​है कि आप मैप मतलब की सूची में एक और किस्म? 'arr.map (फ़ंक्शन (आइटम) {वापसी {कुछ भी: 1}});' – Ziki

उत्तर

22

यह काम नहीं कर रहा है क्योंकि सभी आप कर रहे हैं तर्क आप दिए गए थे (item) है, जो सरणी के लिए एक जीवित कनेक्शन नहीं है का मान अद्यतन करने के लिए है। जैसे ही आपका कॉलबैक लौटाता है, वह परिवर्तन गायब हो जाता है।

यह करने के लिए सबसे उपयुक्त तरीका map उपयोग करने के लिए है:

var arr = [{num: 1}, {num: 2}]; 

arr = arr.map(function(item) { 
    return {somethingElse: 1}; 
}); 

console.log(arr); 

map प्रत्येक आइटम अपने समारोह देता है और एक नई सरणी जो कुछ से तुम वापस बनाता है।

यदि यह महत्वपूर्ण है कि आप में जगह सरणी अद्यतन एक नया एक के निर्माण के बजाय, आप forEach उपयोग कर सकते हैं, तो आप सिर्फ वापस सरणी तत्व आप अद्यतन कर रहे हैं करने के लिए आवंटित करने के लिए किया है। forEach को दूसरा तर्क ':, ऊपर

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item, index) { 
    arr[index] = {somethingElse: 1}; 
}); 

console.log(arr); 

बेशक

, दोनों ही मामलों में आप वास्तव में कुछ के लिए item, जो आप नहीं कर रहे का उपयोग किया था रों कॉलबैक सूचकांक आप जा रहे हैं, इसलिए है' आपके उदाहरण कोड में टी ... यदि आप item पर गुणों को जोड़ना/निकालना चाहते हैं, तो ऑब्जेक्ट को पूरी तरह से प्रतिस्थापित नहीं करें, Cyril's answer आपको दिखाता है कि यह कैसे करें।

+0

@epascarello: धन्यवाद, तय किया गया। –

1

आप कॉलबैक फ़ंक्शन में स्थानीय संदर्भ item बदल रहे हैं।

सरणी सामग्री को बदलने के लिए, जैसा कि नीचे

arr.forEach(function(item, i) { 
    arr[i] = {somethingElse: 1} //using index, change the reference in array 
}); 
0

में दिखाया गया है आप वस्तु पर काम नहीं कर रहे हैं, ताकि परिवर्तन हस्तांतरित नहीं कर रहे हैं आप, सरणी सूचकांक उपयोग करें और यह करने के लिए नए संदर्भ सौंपने होंगे।

आप इस के बजाय कर सकते हैं:

arr.forEach(function(item, ind, array) { 
    array[ind] = {somethingElse: 1} 
}); 
4

जवाब

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item) { 
    item.something = 2;//setting the value 
    delete item.num;//deleting the num from the object 
}); 
+1

हाँ, यह दूसरी संभावना है: ऑब्जेक्ट को म्यूट करना। –

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