2012-02-20 16 views
37

मैं एक मानक jQuery प्लगइन की स्थापना की है कि शीर्ष पर डिफ़ॉल्ट सेटिंग्स बनाता है:जावास्क्रिप्ट: से अधिक शाब्दिक मान वस्तु पुनरावृति

jQuery.fn.myPlugin = function(options) { 
    var defaults = { 
     starts: "0px,0px", 
     speed: 250, ... 
    }; 
    o = $.extend(defaults, options); 
} 

मैं एक चर numberOfObjects कहा जाता है।

मैं डिफ़ॉल्ट चर के माध्यम से लूप करने की कोशिश कर रहा हूं। प्रत्येक ऑब्जेक्ट के लिए (numberOfObjects से) मुझे चर वैल्यू के मान को डुप्लिकेट करने की आवश्यकता है। इसलिए, यदि numberOfObjects चर 3 है, तो defaults.starts0px,0px > 0px,0px > 0px,0px होना चाहिए। > का उपयोग मूल्यों को विभाजित करने के लिए किया जाता है।

यह मेरे पास वर्तमान में है। X डिफ़ॉल्ट के अंदर परिवर्तनीय नाम का प्रतिनिधित्व करता है। Yx के वर्तमान मान के लिए चर का प्रतिनिधित्व करता है। मुझे अब तक यह मिल गया है और कोई संकेत नहीं है कि आगे क्या करना है।

for (x in defaults) { // x is defaults.x 
    defaults.x = defaults.x + " > y"; 
} 

उत्तर

72
var obj = { 
    'foo': 1, 
    'bar': 2 
}; 

for (var key in obj) { 
    console.log(obj[key]); 
} 

या jQuery के साथ:

$.each(obj, function(key, value) { 
    console.log(this, value, obj[key]); 
}); 
+0

बहुत बढ़िया! यह पूरी तरह से काम किया! धन्यवाद :) – Aaron

+5

इस विधि के साथ समस्या यह भी है कि आपको यह भी जांचना चाहिए कि क्या संपत्ति प्रोटोटाइप की बजाय ऑब्जेक्ट से संबंधित है या नहीं। मैं 'object.keys (obj)' – ivstas

+1

@Kite के साथ @ ब्लेयर-एंडरसन समाधान का उपयोग करने का सुझाव देता हूं, जबकि सच है, विशेष रूप से 'ऑब्जेक्ट लिटरल्स' – Petah

3

अपने कोड में:

for(x in defaults){ 
    defaults.x = defaults.x + " > y"; 
} 

आप defaults[x] बजाय defaults.x कहने के लिए की जरूरत है।

x एक चर है जिसमें एक स्ट्रिंग है जो defaults ऑब्जेक्ट में कुंजी है, और ब्रैकेट (सरणी-शैली) वाक्यविन्यास आपको संपत्ति प्राप्त करने के लिए उस चर का उपयोग करने देता है। डॉट नोटेशन defaults.x के साथ वास्तव में "x" नामक एक संपत्ति की तलाश है, जो defaults["x"] के बराबर है।

+0

ठीक है, मैं उलझन में हूँ। अगर मैं console.log लॉग करता हूं (डिफ़ॉल्ट [प्रारंभ]] मुझे बिल्कुल कुछ नहीं मिलता है, लेकिन अगर मैं console.log (defaults.starts) लॉग करता हूं तो यह स्ट्रिंग खींचता है। एक्स सिर्फ एक स्टैंड-इन वैरिएबल है जिसे मुझे लूप के भीतर 'स्टार्ट', 'स्पीड' इत्यादि को डिफॉल्ट के माध्यम से असाइन करने की आवश्यकता है - इसलिए मुझे defaults.starts और defaults.speed, आदि मिलते हैं। क्या मैं डिफ़ॉल्ट सेट अप कर रहा हूं खंड गलत तरीके से? धन्यवाद! – Aaron

+0

डॉट नोटेशन संपत्ति के वास्तविक नाम के साथ काम करता है, इसलिए आपके उदाहरण में 'defaults.starts' काम करता है क्योंकि आपके पास एक संपत्ति नाम है जो स्ट्रिंग "प्रारंभ" है। समकक्ष ब्रैकेट नोटेशन 'डिफ़ॉल्ट ["प्रारंभ होता है]]' - उद्धरण नोट करें। स्क्वायर ब्रैकेट के अंदर बिट किसी भी जेएस अभिव्यक्ति होना चाहिए जो एक स्ट्रिंग देता है ताकि यदि आप कहते हैं कि 'डिफ़ॉल्ट [प्रारंभ]' एक चर 'प्रारंभ' की तलाश में है, जो आपके पास नहीं है जो अपरिभाषित लौटाता है। इसे पढ़ें: https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects – nnnnnn

32

आपको इसके लिए jQuery पर निर्भर नहीं होना चाहिए।

Object.keys(obj).forEach(function (key) { 
    var value = obj[key]; 
    // do something with key or value 
}); 
+0

यदि आप IE से कम IE का समर्थन करने की आवश्यकता है तो पॉलीफ़िल के लिंक पर भी जाएं। – Greg

+1

ईएसलिंट के साथ एयरबीएनबी स्टाइलगाइड के मुताबिक, यह 'ओआरजे में var कुंजी)' – Timo

5

सर्वश्रेष्ठ अभ्यास करता है, तो वस्तु विशेषता है कि अधिक दोहराया जा रहा वस्तु ही है और से है मान्य करने के लिए है n प्रोटोटाइप श्रृंखला से विरासत में मिला। आप इसे .hasOwnProperty() का उपयोग करके देख सकते हैं: (बेशक यदि आप विरासत गुणों को शामिल करना चाहते हैं तो बस कथन को हटा दें)।

for(var index in object) { 
    if (object.hasOwnProperty(index)) { 
     var value = object[index]; 
     // do something with object value here. 
    } 
} 

यहां उदाहरण के मामले आप का उल्लेख किया जहां वर numberofobjects (मैं के मूल्य के अनुसार दोहराया दोहराया प्रत्येक कुंजी के मूल्य के साथ एक नकली वस्तु बनाने के लिए चाहते हैं:

यहाँ सामान्य मामला है इससे पहले कि हम आरंभ करने के

// function to repeat value as a string inspired by disfated's answer here http://stackoverflow.com/questions/202605/repeat-string-javascript 

function repeatValue(value, count) { 
    value = String(value); // change to string to be able to add " > " as in question 
    if (count < 1) return ''; 
    var result = ''; 
    while (count > 1) { 
     if (count & 1) result += value + " > "; 
     count >>= 1, value += " > " + value; 
    } 
    return result + value; 
} 

var numberofobjects = 3; 
var newObject = {}; // for use if creating a duplicate object with the new values 

for(var x in defaults) { 
    if (defaults.hasOwnProperty(x)) { 
     //use this to replace existing values 
     defaults[x] = repeatValue(defaults[x], numberofobjects); 

     //or use this to create values in the new object 
     newObject[x] = repeatValue(defaults[x], numberofobjects); 
    } 
} 
3

आइए सेटअप हमारी बुनियादी वस्तु: दो समाधान में जोड़ दिया है 'जिससे आप मौजूदा ऑब्जेक्ट को संशोधित करने या एक नया एक) बना सकते

const x = { 
    x: 1, 
    y: 2, 
    z: 3 
}; 

हम ऑब्जेक्ट.की (x) का उपयोग हमारी ऑब्जेक्ट के भीतर सभी चाबियों की सरणी को वापस करने के लिए कर सकते हैं।

Object.keys(x) 
> ['x', 'y', 'z'] 

अब हम मैप करने के लिए, फिल्टर, हमारे सरणी पर कम करने और पाश और हमारे वस्तु के भीतर है कि मूल्य के साथ कुछ करने में सक्षम:

Object.keys(x).map(key => x[key] + 1) 
> [2,3,4] 

Object.keys(x).forEach(key => console.log(x[key])) 
> [1,2,3] 

मुख्य दूर यहाँ ले हम का उपयोग करना होगा है उस विशिष्ट मूल्य तक पहुंचने के लिए कुंजी, यह काम करता है लेकिन यह थोड़ा गड़बड़ महसूस करता है। ES2017 Object.values() के साथ लाता है जिसे Object के भीतर सभी मानों की सरणी लौटने के लिए एक अच्छा शॉर्टकट के रूप में उपयोग किया जा सकता है।

Object.values(x) 
> [1,2,3] 

Object.values(x).map(value => value + 1) 
> [2,3,4] 

Object.values(x).forEach(value => console.log(value)) 
> [1,2,3] 

आप Object.values ​​() MDN पर के बारे में अधिक पढ़ सकते हैं, वे भी एक polyfill, आप पुराने ब्राउज़र & ब्राउज़रों जो अभी तक यह लागू नहीं किया है समर्थन करने के लिए की आवश्यकता चाहिए शामिल हैं।

+1

पर सबसे पसंदीदा तरीका है। यह सबसे पूरा समाधान है। धन्यवाद! –

0

var yourVariable = { 
 
    Bobe: 23, 
 
    Pope: 33, 
 
    Doop: 43, 
 
    Dope: 53 
 
}; 
 

 
for(var keyName in yourVariable){ 
 
document.write(keyName, " : ",yourVariable[keyName]," "); 
 
};

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