यदि एक जावास्क्रिप्ट वस्तु है:
var objects={...};
मान लीजिए, इसमें 50 से अधिक संपत्तियां हैं, संपत्ति के नामों को जाने बिना (यह 'कुंजियों को जाने बिना') प्रत्येक संपत्ति के मूल्य को एक लूप में कैसे प्राप्त किया जाए?
यदि एक जावास्क्रिप्ट वस्तु है:
var objects={...};
मान लीजिए, इसमें 50 से अधिक संपत्तियां हैं, संपत्ति के नामों को जाने बिना (यह 'कुंजियों को जाने बिना') प्रत्येक संपत्ति के मूल्य को एक लूप में कैसे प्राप्त किया जाए?
जवाबों:
एक साधारण for..in
लूप का उपयोग करके :
for(var key in objects) {
var value = objects[key];
}
enumerable
झंडे के लिए उनका झंडा है। यह - अन्य चीजों के बीच - इसका मतलब है कि आप किसी भी वर्ग के तरीकों पर पुनरावृत्ति नहीं करेंगे, लेकिन आप अन्य तरीकों से बनाई गई विधियों पर पुनरावृति करेंगे।
आपको किन ब्राउज़रों का समर्थन करना है, इसके आधार पर यह कई तरीकों से किया जा सकता है। वाइल्ड सपोर्ट ECMAScript 5 (ES5) में ब्राउज़रों का भारी बहुमत, लेकिन चेतावनी दी जाती है कि नीचे दिए गए कई उदाहरण Object.keys
, जो IE <9. में उपलब्ध नहीं हैं, संगतता तालिका देखें ।
यदि आपको IE के पुराने संस्करणों का समर्थन करना है, तो यह आपके लिए विकल्प है:
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var val = obj[key];
// use val
}
}
नेस्टेड if
सुनिश्चित करता है कि आप ऑब्जेक्ट की प्रोटोटाइप श्रृंखला में गुणों पर गणना नहीं करते हैं (जो व्यवहार आप निश्चित रूप से चाहते हैं)। तुम्हें अवश्य उपयोग करना चाहिए
Object.prototype.hasOwnProperty.call(obj, key) // ok
बजाय
obj.hasOwnProperty(key) // bad
क्योंकि ECMAScript 5+ आपको प्रोटोटाइप रहित ऑब्जेक्ट बनाने की अनुमति देता है Object.create(null)
, और इन ऑब्जेक्ट्स में hasOwnProperty
विधि नहीं होगी । शरारती कोड उन वस्तुओं का भी उत्पादन कर सकता है जो hasOwnProperty
विधि को ओवरराइड करते हैं ।
आप इन विधियों का उपयोग किसी भी ब्राउज़र में कर सकते हैं जो ECMAScript 5 और उसके बाद के संस्करण का समर्थन करता है। ये एक वस्तु से मान प्राप्त करते हैं और प्रोटोटाइप श्रृंखला पर गणना करने से बचते हैं। obj
आपकी वस्तु कहां है:
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
var val = obj[keys[i]];
// use val
}
यदि आप कुछ अधिक कॉम्पैक्ट चाहते हैं या आप लूप में कार्यों से सावधान रहना चाहते हैं, तो Array.prototype.forEach
आपका मित्र है:
Object.keys(obj).forEach(function (key) {
var val = obj[key];
// use val
});
अगली विधि किसी ऑब्जेक्ट के मान युक्त एक सरणी बनाता है। यह लूपिंग ओवर के लिए सुविधाजनक है।
var vals = Object.keys(obj).map(function (key) {
return obj[key];
});
// use vals array
यदि आप उन लोगों के Object.keys
खिलाफ सुरक्षित उपयोग करना चाहते हैं जो null
(जैसा for-in
है), तो आप कर सकते हैं Object.keys(obj || {})...
।
Object.keys
असंख्य गुण देता है । साधारण वस्तुओं पर पुनरावृत्ति के लिए, यह आमतौर पर पर्याप्त है। यदि आपके पास गैर-अनुपम गुणों के साथ कुछ है जिसे आपको काम करने की आवश्यकता है, तो आप इसके Object.getOwnPropertyNames
स्थान पर उपयोग कर सकते हैं Object.keys
।
ECMAScript 2015 के साथ एरेट करना आसान हो जाता है। जब आप लूप में एक-एक करके मानों के साथ काम करते हैं तो आप इसे अपने फायदे के लिए इस्तेमाल कर सकते हैं:
for (const key of Object.keys(obj)) {
const val = obj[key];
// use val
}
ECMAScript 2015 वसा-तीर फ़ंक्शंस का उपयोग करके ऑब्जेक्ट को मानों की एक सरणी में मैप करना एक-लाइनर बन जाता है:
const vals = Object.keys(obj).map(key => obj[key]);
// use vals array
ECMAScript 2015 पेश करता है Symbol
, जिसके उदाहरण संपत्ति के नाम के रूप में इस्तेमाल किए जा सकते हैं। किसी वस्तु के प्रतीकों को प्राप्त करने के लिए, उपयोग करें Object.getOwnPropertySymbols
(यह फ़ंक्शन इसीलिए निजी संपत्तियों को बनाने के लिए उपयोग Symbol
नहीं किया जा सकता है)। Reflect
ईसीएमएस्क्रिप्ट 2015 से नया एपीआई प्रदान करता है Reflect.ownKeys
, जो संपत्ति के नामों (गैर-एन्यूमरेबल सहित) और प्रतीकों की एक सूची देता है।
प्रकाशन से पहले ECMAScript 6 से एरियर की समझ को हटा दिया गया था । उनके हटाने से पहले, एक समाधान जैसा दिखता होगा:
const vals = [for (key of Object.keys(obj)) obj[key]];
// use vals array
ECMAScript 2016 में ऐसी सुविधाएँ शामिल हैं जो इस विषय को प्रभावित नहीं करती हैं। ECMAScript 2017 विनिर्देशन जोड़ता है Object.values
और Object.entries
। दोनों रिटर्न एरे (जो कुछ के साथ सादृश्य दिया आश्चर्य होगा Array.entries
)। Object.values
के रूप में या एक for-of
पाश के साथ इस्तेमाल किया जा सकता है ।
const values = Object.values(obj);
// use values array or:
for (const val of Object.values(obj)) {
// use val
}
यदि आप कुंजी और मूल्य दोनों का उपयोग करना चाहते हैं, तो Object.entries
आपके लिए है। यह [key, value]
जोड़े से भरा एक सरणी पैदा करता है । आप इस का उपयोग कर सकते हैं, या एक for-of
लूप में ECMAScript 2015 विनाशकारी असाइनमेंट पर ध्यान दें) :
for (const [key, val] of Object.entries(obj)) {
// use key and val
}
Object.values
परतअंत में, जैसा कि टिप्पणियों में लिखा गया है और एक अन्य जवाब में teh_senaus द्वारा, यह एक शिम के रूप में इनमें से एक का उपयोग करने के लायक हो सकता है। चिंता न करें, निम्नलिखित प्रोटोटाइप नहीं बदलता है, यह सिर्फ एक विधि जोड़ता है Object
(जो बहुत कम खतरनाक है)। वसा-तीर फ़ंक्शन का उपयोग करना, यह एक पंक्ति में भी किया जा सकता है:
Object.values = obj => Object.keys(obj).map(key => obj[key]);
जिसे अब आप उपयोग कर सकते हैं
// ['one', 'two', 'three']
var values = Object.values({ a: 'one', b: 'two', c: 'three' });
यदि आप मूल निवासी होने पर चमक से बचना चाहते हैं Object.values
, तो आप कर सकते हैं:
Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));
उन ब्राउज़र / संस्करणों से अवगत रहें, जिनका आपको समर्थन करने की आवश्यकता है। उपरोक्त सही हैं जहाँ विधियाँ या भाषा सुविधाएँ लागू की जाती हैं। उदाहरण के लिए, ECMAScript 2015 के लिए समर्थन V8 में डिफ़ॉल्ट रूप से हाल ही में बंद कर दिया गया था, जो क्रोम जैसे ब्राउज़र संचालित करता था। ECMAScript 2015 की विशेषताओं को तब तक टाला जाना चाहिए जब तक कि आपके द्वारा आवश्यक सुविधाओं को लागू करने के लिए ब्राउज़रों का समर्थन करने का इरादा न हो। यदि आप ECMAScript 5 में अपने कोड को संकलित करने के लिए babel का उपयोग करते हैं, तो आपके पास इस उत्तर में सभी सुविधाओं तक पहुंच है।
obj
दो बार उल्लेख करने की आवश्यकता है । मुझे लगता है कि एक सहायक समारोह बनाना अपरिहार्य है? मान (obj) जैसा कुछ।
Object.values = obj => Object.keys(obj).map(key => obj[key]);
यहाँ एक सरणी में मान प्राप्त करने के लिए पुन: प्रयोज्य कार्य है। यह प्रोटोटाइप को भी ध्यान में रखता है।
Object.values = function (obj) {
var vals = [];
for( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
vals.push(obj[key]);
}
}
return vals;
}
Object
कोई समस्या नहीं है ( Object.keys
एक सामान्य शिम है), आप शायद ऑब्जेक्ट प्रोटोटाइप को संशोधित करने के बारे में सोच रहे हैं।
hasOwnProperty()
? उस ऑब्जेक्ट के लूप के भीतर कुंजी को कैसे पुनरावृत्त किया जाएगा संपत्ति नहीं मिली है?
यदि आपके पास Underscore.js तक पहुंच है, तो आप _.values
फ़ंक्शन का उपयोग इस तरह कर सकते हैं :
_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
यदि आप वास्तव में मानों की एक सरणी चाहते हैं, तो मुझे यह क्लीनर लूप में एक ... के साथ एक सरणी बनाने की तुलना में मिलता है।
ECMA 5.1+
function values(o) { return Object.keys(o).map(function(k){return o[k]}) }
यह ध्यान देने योग्य है कि ज्यादातर मामलों में आपको वास्तव में मूल्यों की एक सरणी की आवश्यकता नहीं होती है, ऐसा करने के लिए यह तेज़ होगा:
for(var k in o) something(o[k]);
यह ऑब्जेक्ट o की कुंजियों पर आधारित है। प्रत्येक पुनरावृत्ति में k को o की कुंजी पर सेट किया जाता है।
ES5 Object.keys
var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]
आप कुंजियों के माध्यम से लूप कर सकते हैं:
foo = {one:1, two:2, three:3};
for (key in foo){
console.log("foo["+ key +"]="+ foo[key]);
}
उत्पादन होगा:
foo[one]=1
foo[two]=2
foo[three]=3
ECMA2017 आगे:
Object.values(obj)
आप एक सरणी के रूप में सभी संपत्ति मूल्यों को प्राप्त करेंगे।
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
जाहिरा तौर पर - जैसा कि मैंने हाल ही में सीखा है - यह इसे करने का सबसे तेज़ तरीका है:
var objs = {...};
var objKeys = Object.keys(obj);
for (var i = 0, objLen = objKeys.length; i < objLen; i++) {
// do whatever in here
var obj = objs[objKeys[i]];
}
यह सवाल निर्दिष्ट नहीं करता है कि क्या विरासत में मिला और गैर-अनगिनत गुण भी चाहिए।
है भी सब कुछ, विरासत में मिला गुण और गैर गणनीय गुण प्राप्त करने के लिए एक सवाल यह है कि गूगल आसानी से मिल नहीं कर सकते।
उस के लिए मेरा समाधान है:
function getAllPropertyNames(obj) {
let result = new Set();
while (obj) {
Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
obj = Object.getPrototypeOf(obj);
}
return [...result];
}
और फिर उन पर पुनरावृति, बस एक लूप के लिए उपयोग करें:
उपयोग करें: Object.values()
हम एक ऑब्जेक्ट में एक तर्क के रूप में पास करते हैं और एक मान मान रिटर्न के रूप में प्राप्त करते हैं।
यह किसी दिए गए ऑब्जेक्ट के एक सरणी के लिए खुद की असंख्य संपत्ति मान देता है। आप for in
लूप का उपयोग करके उसी तरह के मान प्राप्त करेंगे, लेकिन प्रोटोटाइप पर गुणों के बिना। यह उदाहरण शायद चीजों को स्पष्ट करेगा:
function person (name) {
this.name = name;
}
person.prototype.age = 5;
let dude = new person('dude');
for(let prop in dude) {
console.log(dude[prop]); // for in still shows age because this is on the prototype
} // we can use hasOwnProperty but this is not very elegant
// ES6 +
console.log(Object.values(dude));
// very concise and we don't show props on prototype
यहाँ PHP के array_values () के समान फ़ंक्शन है
function array_values(input) {
var output = [], key = '';
for ( key in input ) { output[output.length] = input[key]; }
return output;
}
यदि आप ES6 या उच्चतर का उपयोग कर रहे हैं, तो ऑब्जेक्ट का मान कैसे प्राप्त करें:
Array.from(values(obj));
चूंकि, ES7 & Object.values(<object>)
में बनाया जाएगा
समर्थन करने के लिए सभी ब्राउज़रों की प्रतीक्षा करने तक, आप इसे किसी फ़ंक्शन के अंदर लपेट सकते हैं:
Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k])
फिर :
Object.vals({lastname:'T',firstname:'A'})
// ['T','A']
Object.entries इसे बेहतर तरीके से करते हैं।
var dataObject = {"a":{"title":"shop"}, "b":{"title":"home"}}
Object.entries(dataObject).map(itemArray => {
console.log("key=", itemArray[0], "value=", itemArray[1])
})
const myObj = { a:1, b:2, c:3 }
सभी मान प्राप्त करें:
सबसे छोटा तरीका:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
में ECMAScript5 उपयोग
keys = Object.keys(object);
अन्यथा यदि आप ब्राउज़र इसका समर्थन नहीं करते हैं, तो प्रसिद्ध का उपयोग करें for..in loop
for (key in object) {
// your code here
}
object[key]
मूल्यों को एक लूप में प्राप्त करने के लिए उपयोग करने में सक्षम हैं ।
for..in
(और hasOwnProperty) तो यह वास्तव में कुछ भी हासिल नहीं होता है .. मुझे लगता है कि ECMAScript 5 वीं परिभाषित इच्छा Object.pairs
(और Object.items
के लिए [[key, value], ..]
), लेकिन अफसोस, ऐसा नहीं है।
अब मैं Dojo टूलकिट का उपयोग करता हूं क्योंकि पुराने ब्राउज़र समर्थन नहीं करते हैं Object.values
।
require(['dojox/lang/functional/object'], function(Object) {
var obj = { key1: '1', key2: '2', key3: '3' };
var values = Object.values(obj);
console.log(values);
});
आउटपुट:
['1', '2', '3']