2016-05-07 3 views
5

मुझे नोडजेएस में [].forEach के साथ अजीब समस्या है।नोडजेएस [] .forEach अपरिभाषित

(का उपयोग करते हुए NodeJS v5.4.1)

एक समारोह

function _buildUserQuestionsForDisplay(question,callback){ 
    var res = {} 
    ["is_open","created","deleted","_id"].forEach(function(v){ 
     res[v] = question[v] 
    }) 
    ... 
    ... 
} 

एक त्रुटि फेंकने में इस कोड है:

["is_open","created","deleted","_id"].forEach(function(v){

TypeError: Cannot read property 'forEach' of undefined

यह काम करता है अगर मैं

करने के लिए कोड बदल रहा हूँ
var arr = ["is_open","created","deleted","_id"]; 
arr.forEach(function(v){ 
    res[v] = question[v] 
}) 

मेरे पास टेस है Chrome.console पर वही कार्य किया और पहला तरीका काम करता है।
मुझे पता है कि V8 जेएस इंजन का उपयोग कर दोनों, क्या यह एक बग या कुछ है जिसे मैं जावास्क्रिप्ट नियमों के साथ याद कर रहा हूं?

धन्यवाद!

+1

क्या नोड भी उस कोड के एक स्टैंडअलोन न्यूनतम संस्करण के साथ विफल रहता है? क्या आप किसी भी मॉड्यूल का उपयोग कर रहे हैं जो 'Array.prototype' या' Object.prototype' को बदल सकता है? – robertklep

+3

यदि आप 'var res = {}' के बाद अर्द्ध-कोलन डालते हैं तो क्या यह काम करता है? – Andy

+0

@ एंडी आप सही हैं, मुझे थोड़े बेवकूफ लगते हैं, जावास्क्रिप्ट कंपाइलर को इसके बारे में माफ कर देना चाहिए अगर मैं नई लाइन डालूं, नहीं? –

उत्तर

3

आपका कोड टूट जाता है, तो आप इस लाइन के बाद एक सेमी-कोलन की जरूरत नहीं है:

var res = {} 

इन समस्याओं को एक अच्छा विचार है अगर आप उपयोग नहीं कर रहे एक लिंटर उपयोग करने के लिए है कम करने के लिए। JSHint और ESLint को आपके कोड संपादक में देव प्लगइन के रूप में जोड़ा जा सकता है (मैं सबलिमेमटेक्स्ट में एयरबिन स्टाइलशीट के साथ ईएसलिंट का उपयोग करता हूं), और कोड करने से पहले इस तरह की त्रुटियों को पकड़ने के लिए गुलप या ग्रंट का उपयोग करके अपने वर्कफ़्लो में भी जोड़ा जा सकता है।

If you choose to omit semicolons where possible, my advice is to insert them immediately before the opening parenthesis or square bracket in any statement that begins with one of those tokens, or any which begins with one of the arithmetic operator tokens "/", "+", or "-" if you should happen to write such a statement. - blog entry by Michaeljohn Clement 2010

+0

धन्यवाद महत्वपूर्ण है! बीटीडब्ल्यू मै मैक एडिटर (मैक के लिए ग्रेट नोडजेएस एडिटर, 9000% सीपीयू नेटबीन से बेहतर) के लिए विजुअल स्टूडियो का उपयोग कर रहा हूं, लेकिन शायद माइक्रोसॉफ्ट ने नए लाइन कैरेक्टर के साथ कुछ गलत किया है कि कंपाइलर –

+5

पसंद नहीं करेगा मुझे लगता है कि "कुछ कारण" है कि अर्धविराम के बिना कोड क्या कर रहा है खाली वस्तु की "_id" संपत्ति तक पहुंचने का प्रयास कर रहा है, जो निश्चित रूप से अनिर्धारित है और इसमें प्रत्येक() विधि नहीं है। – nnnnnn

+0

@nnnnnn जैसा कि मैंने समझा; मेरा कोड अगली बात कर रहा था (उदाहरण के लिए) '{ए: 5} [" ए "] // 5' और' {ए: 5} ["बी"] // अपरिभाषित ', और उस पर मैं था प्रत्येक के लिए कर रहा है, जो आपने '_id' key –