जावास्क्रिप्ट ऑब्जेक्ट के सभी गुण मान कैसे प्राप्त करें (कुंजियों को जाने बिना)?


455

यदि एक जावास्क्रिप्ट वस्तु है:

var objects={...};

मान लीजिए, इसमें 50 से अधिक संपत्तियां हैं, संपत्ति के नामों को जाने बिना (यह 'कुंजियों को जाने बिना') प्रत्येक संपत्ति के मूल्य को एक लूप में कैसे प्राप्त किया जाए?


23
पाठकों के लिए ध्यान दें: 'बहुत ही
हर्षजनक

जवाबों:


447

एक साधारण for..inलूप का उपयोग करके :

for(var key in objects) {
    var value = objects[key];
}

90
प्रोटोटाइप ऑब्जेक्ट के गुणों के बारे में सावधान रहें जो विरासत में मिला है। देखें: hasOwnProperty ()
जैतून

102
यदि आप इस उत्तर को पढ़ रहे हैं, तो आपको निश्चित रूप से दूसरे को
mgarciaisaia

18
यदि आप इस उत्तर को पढ़ रहे हैं और आप संभवतः स्ट्रिंग्स के साथ काम कर रहे हैं, तो आपको निश्चित रूप से चेहरे में जावास्क्रिप्ट पंच करना चाहिए।

यदि आप उपर्युक्त उत्तर को पढ़ते हैं और जावास्क्रिप्ट को चेहरे पर मुक्का मारना
slugmandrew

शायद यह इंगित करना चाहिए कि इसमें ऐसी संपत्तियाँ शामिल नहीं होंगी जिनके पास enumerableझंडे के लिए उनका झंडा है। यह - अन्य चीजों के बीच - इसका मतलब है कि आप किसी भी वर्ग के तरीकों पर पुनरावृत्ति नहीं करेंगे, लेकिन आप अन्य तरीकों से बनाई गई विधियों पर पुनरावृति करेंगे।
अमीर रईस

1012

आपको किन ब्राउज़रों का समर्थन करना है, इसके आधार पर यह कई तरीकों से किया जा सकता है। वाइल्ड सपोर्ट ECMAScript 5 (ES5) में ब्राउज़रों का भारी बहुमत, लेकिन चेतावनी दी जाती है कि नीचे दिए गए कई उदाहरण Object.keys, जो IE <9. में उपलब्ध नहीं हैं, संगतता तालिका देखें ।

ECMAScript 3+

यदि आपको 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+

आप इन विधियों का उपयोग किसी भी ब्राउज़र में कर सकते हैं जो 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+ (AKA ES6)

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 2017+

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 का उपयोग करते हैं, तो आपके पास इस उत्तर में सभी सुविधाओं तक पहुंच है।


9
यह स्वीकार किया जाना चाहिए (या अधिक से अधिक उत्कीर्ण) उत्तर को स्वीकार किया जाना चाहिए क्योंकि स्वीकृत एक अपूर्ण है (@olive अंक इस बाहर)।
0xc0de

यह शर्म की बात है कि सभी तथाकथित चालें, हमें अभी भी objदो बार उल्लेख करने की आवश्यकता है । मुझे लगता है कि एक सहायक समारोह बनाना अपरिहार्य है? मान (obj) जैसा कुछ।
स्टीवन हरेंटो

इनमें से किसी भी तरीके को शिम के रूप में इस्तेमाल किया जा सकता है। उदाहरण के लिए:Object.values = obj => Object.keys(obj).map(key => obj[key]);
२४:१३

1
ECMA 5 समाधान सभी आधुनिक ब्राउज़रों में काम करना चाहिए। ECMA 6 को अभी तक अंतिम रूप नहीं दिया गया है, और सभी ब्राउज़रों में समर्थन प्रारंभिक है। Chrome में, ECMA 6 आंशिक रूप से लागू किया गया है लेकिन अक्षम है। फ़ायरफ़ॉक्स में, समर्थन बेहतर है लेकिन सरणी समझ गलत है (जैसा कि उल्लेख किया गया है)। मुझे लगा कि भविष्य के तनाव का मेरा उपयोग यह होगा। @JacekLampart, किस समाधान ने आपको त्रुटि दी?
क्वेटी

2
मैं कल्पना नहीं कर सकता कि हमें Object.values ​​() पद्धति प्राप्त करने के लिए ES2017 की प्रतीक्षा क्यों करनी है।
हर्बर्टुस

31

यहाँ एक सरणी में मान प्राप्त करने के लिए पुन: प्रयोज्य कार्य है। यह प्रोटोटाइप को भी ध्यान में रखता है।

Object.values = function (obj) {
    var vals = [];
    for( var key in obj ) {
        if ( obj.hasOwnProperty(key) ) {
            vals.push(obj[key]);
        }
    }
    return vals;
}

15
संशोधित करना Objectकोई समस्या नहीं है ( Object.keysएक सामान्य शिम है), आप शायद ऑब्जेक्ट प्रोटोटाइप को संशोधित करने के बारे में सोच रहे हैं।
सैंडस्ट्रॉम

आपको परीक्षण करने की आवश्यकता क्यों होगी hasOwnProperty()? उस ऑब्जेक्ट के लूप के भीतर कुंजी को कैसे पुनरावृत्त किया जाएगा संपत्ति नहीं मिली है?
१२५२ 25४48

4
Google ने @thomas, यह महत्वपूर्ण है। इसकी प्रोटोटाइप श्रृंखला से गुण हो सकते हैं।
जो

28

यदि आपके पास Underscore.js तक पहुंच है, तो आप _.valuesफ़ंक्शन का उपयोग इस तरह कर सकते हैं :

_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]

@MathieuAmiot - व्याख्या करने के लिए देखभाल?
पैडन

दर्जना एक अंडरस्कोर, (एक तरह से) तेजी से एक के लिए एक एपीआई-संगत प्रतिस्थापन है।
मैथ्यू एमियट

@ यहां पर SO से संबंधित प्रश्न: stackoverflow.com/questions/13789618/…
jichi

2
दर्ज करना इसके लिए अनावश्यक है और यह आपके कोड आधार
dman

14

यदि आप वास्तव में मानों की एक सरणी चाहते हैं, तो मुझे यह क्लीनर लूप में एक ... के साथ एक सरणी बनाने की तुलना में मिलता है।

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 की कुंजी पर सेट किया जाता है।


9

ES5 Object.keys

var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]

3
इसे क्यों ठुकरा दिया गया? मैं कहूंगा कि यह सबसे साफ समाधानों में से एक है।
सेबेस्टियन होजस

मुझे नहीं पता, यह नीचे मतदान क्यों है। यह पुस्तकालयों या किसी अन्य उपयोगिताओं के उपयोग के बिना js में सबसे आसान और शुद्धतम समाधान है।
संजीव शेट्टी

5

आप कुंजियों के माध्यम से लूप कर सकते हैं:

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

2
यदि आपको विरासत में मिली विशेषताओं से बचना है, तो आपको `hasOwnProperty ()’ को भी जांचना होगा।
0xc0de

3

कॉफ़ीस्क्रिप्ट युग में लोगों को जल्दी अपनाने के लिए, यहाँ इसके लिए एक और समकक्ष है।

val for key,val of objects

जो इससे बेहतर हो सकता है क्योंकि objectsफिर से टाइप किया जा सकता है और पठनीयता कम की जा सकती है।

objects[key] for key of objects

3

एक पॉलीफ़िल का उपयोग करें जैसे:

if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])}

तो उपयोग करें

Object.values(my_object)

3) लाभ!


3

ECMA2017 आगे:

Object.values(obj) आप एक सरणी के रूप में सभी संपत्ति मूल्यों को प्राप्त करेंगे।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values


ध्यान दें कि यह विरासत में मिली संपत्ति नहीं लौटाएगा।
अमीर रईस

यह बहुत अच्छा काम करता है .... सिंगल लाइन ने मेरा दिन बचाया ....
स्टैक किडी

2

जाहिरा तौर पर - जैसा कि मैंने हाल ही में सीखा है - यह इसे करने का सबसे तेज़ तरीका है:

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]];
}

क्या आप इसका एक उदाहरण के एक कोडपेन या jsfiddle डाल सकते हैं? धन्यवाद।
क्रिस 22

2

यह सवाल निर्दिष्ट नहीं करता है कि क्या विरासत में मिला और गैर-अनगिनत गुण भी चाहिए।

है भी सब कुछ, विरासत में मिला गुण और गैर गणनीय गुण प्राप्त करने के लिए एक सवाल यह है कि गूगल आसानी से मिल नहीं कर सकते।

उस के लिए मेरा समाधान है:

function getAllPropertyNames(obj) {
    let result = new Set();
    while (obj) {
        Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
        obj = Object.getPrototypeOf(obj);
    }
    return [...result];
}

और फिर उन पर पुनरावृति, बस एक लूप के लिए उपयोग करें:


1

उपयोग करें: 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


1
const object1 = {
  a: 'somestring',
  b: 42
};

for (let [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

// expected output:
// "a: somestring"
// "b: 42"
// order is not guaranteed

0

यहाँ 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));

किसी कारण से मान () क्रोम और फ़ायरफ़ॉक्स में काम कर रहा है, लेकिन iojs / नोड पर नहीं।
jaggedsoft

0

ES7 के साथ संगत भी कुछ ब्राउज़र अभी तक इसका समर्थन नहीं करते हैं

चूंकि, 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']

एक बार जब ब्राउज़र ES7 के साथ संगत हो जाते हैं, तो आपको अपने कोड में कुछ भी नहीं बदलना पड़ेगा।


0

मुझे लगता है मैं थोड़ी देर से हूँ लेकिन यहाँ नई फ़ायरफ़ॉक्स 47 विधि के लिए एक शिम हैObject.values

Object.prototype.values = Object.prototype.values || function(obj) {
  return this.keys(obj).map(function(key){
    return obj[key];
  });
};


0

const myObj = { a:1, b:2, c:3 }

सभी मान प्राप्त करें:

  • सबसे छोटा तरीका:

    • const myValues = Object.values(myObj)
  • const myValues = Object.keys(myObj).map(key => myObj[key])



-5

में ECMAScript5 उपयोग

 keys = Object.keys(object);

अन्यथा यदि आप ब्राउज़र इसका समर्थन नहीं करते हैं, तो प्रसिद्ध का उपयोग करें for..in loop

for (key in object) {
    // your code here
}

17
सवाल मानों का पूछ रहा था, चाबियों का नहीं।
बजे

@zachelrath आप सही कह रहे हैं। - लेकिन यह स्क्रिप्ट उपयोगी है यदि आप मूल्यों को प्राप्त करना चाहते हैं क्योंकि जब आप उन कुंजियों को जानते हैं जो आप object[key]मूल्यों को एक लूप में प्राप्त करने के लिए उपयोग करने में सक्षम हैं ।
15

2
@fridojet लेकिन उस के साथ किया जा सकता है for..in(और hasOwnProperty) तो यह वास्तव में कुछ भी हासिल नहीं होता है .. मुझे लगता है कि ECMAScript 5 वीं परिभाषित इच्छा Object.pairs(और Object.itemsके लिए [[key, value], ..]), लेकिन अफसोस, ऐसा नहीं है।
user2246674

-8

अब मैं 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']

5
सख्ती से बोलना, सरणी सही नहीं है। आपके पास संख्याओं की एक सरणी के बजाय स्ट्रिंग की एक सरणी है।
क्वाट

-10

उपयोग

console.log(variable)

और यदि आप Ctrl + Shift + j का उपयोग करके Google क्रोम ओपन कंसोल का उपयोग कर रहे हैं

गोटो >> कंसोल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.