2016-09-05 8 views
7

के बाद वैरिएबल सेट नहीं करता है, मैं नहीं समझ सकता कि मेरे फ़ंक्शन में वेरिएबल का मूल्य क्यों नहीं बदल रहा है। यहाँ मेरा कोड।जेएस लूप

var count = function(datain){ 
    let temparr = [], 
    countobj = {}; 

    $.each(datain, function(key, val) { 
    console.log(temparr); 
    countobj.cost = +$(val).find("[name]").text(); 
    console.log(countobj); 
    temparr.push(countobj); 
    console.log(temparr); 
    }); 

    console.log(temparr); 
    return temparr; 
}; 

let countarr = count(datain); 
console.log(countarr); 

AJAX सफलता पर आग लगने वाले फ़ंक्शन का यह कार्य हिस्सा, AJAX मैं कुछ चुनिंदा परिवर्तनों पर कॉल करता हूं। डेटैन - अजाक्स का नतीजा। पहली बार इस समारोह को ठीक काम करें, लेकिन सभी अन्य आग मुझे पहली बार काउंटर सेट सेट करती हैं। कुंजी, वैल - सही में सभी डेटा, लेकिन मैं समझ नहीं पा रहा हूं कि क्यों "countarr" मुझे पहले कॉल का परिणाम देता है और फ़ंक्शन के अंदर temparr को फिर से सेट नहीं करता है। उत्तर के लिए धन्यवाद!

उत्तर

2

आप का उपयोग कर रहे हैं countobj प्रत्येक लूप पर ऑब्जेक्ट, उस एकल ऑब्जेक्ट को बार-बार सरणी में संदर्भित करना।

आप प्रत्येक पाश पर एक नई वस्तु बनाने के लिए की जरूरत है: सिर्फ एक संपत्ति है

var count = function(datain) { 
    let temparr = [], 
     countobj;           // *** 
    $.each(datain, function(key, val) { 
     countobj = {};          // *** 
     console.log(temparr); 
     countobj.cost = +$(val).find("[name]").text(); 
     console.log(countobj); 
     temparr.push(countobj); 
     console.log(temparr); 
    }); 
    console.log(temparr); 
    return temparr; 
}; 
let countarr = count(datain); 
console.log(countarr); 

रूप में, आप एक चर जरूरत नहीं है। यहाँ चर के बिना और console.log लाइनों निकाले जाने के साथ कि एक ही कोड है:

var count = function(datain) { 
    let temparr = []; 
    $.each(datain, function(key, val) { 
     temparr.push({cost: +$(val).find("[name]").text()}); 
    }); 
    return temparr; 
}; 
let countarr = count(datain); 
console.log(countarr); 

या आप भी map इस्तेमाल कर सकते हैं;

let count = function(datain) { 
    return datain.map(val => ({cost: +$(val).find("[name]").text()})); 
}; 
let countarr = count(datain); 
console.log(countarr); 

तो datain केवल सरणी की तरह, न कि वास्तविक सरणी है, Array.from बजाय map का उपयोग करें::

और जब से तुम ES2015 उपयोग कर रहे हैं + (मैं let से बता सकते हैं), हम एक तीर समारोह का उपयोग कर सकते
let count = function(datain) { 
    return Array.from(datain, val => ({cost: +$(val).find("[name]").text()})); 
}; 
let countarr = count(datain); 
console.log(countarr); 
+0

धन्यवाद! यह सब मेरे लिए सही है और अब मैं अपनी गलतियों को देखता हूं! फिर से धन्यवाद! – Doom

+2

अच्छा! लेकिन मुझे लगता है कि आप ड्रे के बाद स्पष्ट रूप से स्पष्ट रूप से मानचित्र क्रियान्वयन का उपयोग करने के लिए Array में दूसरे तर्क का उपयोग कर सकते हैं। – ajaykumar

+0

@ajaykumar: अच्छा बिंदु! –