जावास्क्रिप्ट में इसे कैसे करें (कुंजी, मान)?


335

मेरे पास एक शब्दकोश है जिसका प्रारूप है

dictionary = {0: {object}, 1:{object}, 2:{object}}

मैं इस शब्दकोश के माध्यम से कैसे कुछ ऐसा कर सकता हूँ

for((key,value) in dictionary){
  //Do stuff where key would be 0 and value would be the object
}

3
for (let [key, value] of Object.entries(obj)), बेबल की जरूरत है।
१२


1
ES2016 में @elclanrs इसकी और वह अभी तक मानकीकृत नहीं है :-)
thefourtheye


@dooagain, यह इस प्रश्न में एक सरणी नहीं है।
जांगव

जवाबों:


479

tl; डॉ

  1. ECMAScript 5 में, यह संभव नहीं है।
  2. ईसीएमएस्क्रिप्ट 2015 में, यह Mapएस के साथ संभव है ।
  3. ECMAScript 2017 में, यह आसानी से उपलब्ध होगा।

ECMAScript 5:

नहीं, वस्तुओं के साथ संभव नहीं है।

आपको इस तरह से for..inया तो पुनरावृति करनी चाहिए , या Object.keys, इस तरह से

for (var key in dictionary) {
    // check if the property/key is defined in the object itself, not in parent
    if (dictionary.hasOwnProperty(key)) {           
        console.log(key, dictionary[key]);
    }
}

नोट:if हालत से ऊपर, के लिए आवश्यक है केवल यदि आप पुनरावृति करने के लिए गुण जो कर रहे हैं चाहते dictionaryवस्तु बहुत ही है। क्योंकि for..inसभी विरासत में मिले गुणों के माध्यम से पुनरावृति होगी।

या

Object.keys(dictionary).forEach(function(key) {
    console.log(key, dictionary[key]);
});

ईसीएमएस्क्रिप्ट 2015

ECMAScript 2015 में, आप Mapऑब्जेक्ट का उपयोग कर सकते हैं और उनके साथ पुनरावृति कर सकते हैं Map.prototype.entries। उस पृष्ठ से उदाहरण उद्धृत करते हुए,

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

var mapIter = myMap.entries();

console.log(mapIter.next().value); // ["0", "foo"]
console.log(mapIter.next().value); // [1, "bar"]
console.log(mapIter.next().value); // [Object, "baz"]

या for..ofइस तरह से पुनरावृति

'use strict';

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

for (const entry of myMap.entries()) {
  console.log(entry);
}

उत्पादन

[ '0', 'foo' ]
[ 1, 'bar' ]
[ {}, 'baz' ]

या

for (const [key, value] of myMap.entries()) {
  console.log(key, value);
}

उत्पादन

0 foo
1 bar
{} baz

ECMAScript 2017

ECMAScript 2017 एक नया कार्य शुरू करेगा Object.entries। आप इसका उपयोग उस वस्तु को पुन: व्यवस्थित करने के लिए कर सकते हैं जैसा आप चाहते थे।

'use strict';

const object = {'a': 1, 'b': 2, 'c' : 3};
for (const [key, value] of Object.entries(object)) {
  console.log(key, value);
}

उत्पादन

a 1
b 2
c 3

1
यहां एक बुनियादी संदेह। मैं यहाँ देख रहा हूँ कि यह कैसे करना है। नोड में, जो सर्वर की तरफ जावास्क्रिप्ट है। मुझे कैसे पता चलेगा कि मेरे मामले में कौन सा ES संस्करण लागू होता है। नियमित जावास्क्रिप्ट उपयोगकर्ताओं के मामले में भी, समर्थन करने का उचित तरीका क्या है क्योंकि मैं समझता हूं कि ईएस संस्करण क्लाइंट के ब्राउज़र पर निर्भर करता है?
संदीपन नाथ

2
@SandeepanNath आप यह जानने के लिए नोड की तरह वेबसाइटों का उपयोग कर सकते हैं। यदि आपके Node.s.s. जहां तक ​​ब्राउज़रों का संबंध है, लोग आम तौर पर उस संस्करण को लक्षित करते हैं जो व्यापक रूप से समर्थित है, इस मामले में, ईएस 5। इसके अलावा, ट्रांसपॉयलर (जैसे बाबेल ) ES2015 + कोड को ES5 में बदलने में मदद करते हैं।
thefourtheye

1
मुझे Object.keys(dictionary).forEach(function(key) {…बहुत पठनीय, और संगत पसंद है।
ctrl-alt-delor

5
Object.entries(object).forEach(([key, val]) => {...});
क्रिम्सन

ECMAScript 2015 का समाधान ऊपर दिया गया "टाइपस्क्रिप्ट और Iterator: टाइप 'IterableIterator <T>' एक सरणी प्रकार नहीं है" लेकिन सादे ol myMap ()। foreach () ने अच्छी तरह से काम किया।
ttugates

60

इसे इस्तेमाल करे:

dict = {0:{1:'a'}, 1:{2:'b'}, 2:{3:'c'}}
for (var key in dict){
  console.log( key, dict[key] );
}

0 Object { 1="a"}
1 Object { 2="b"}
2 Object { 3="c"}

42

Object.entries()विधि ES2017 में निर्दिष्ट किया गया है (और है सभी आधुनिक ब्राउज़रों में समर्थित ):

for (const [ key, value ] of Object.entries(dictionary)) {
    // do something with `key` and `value`
}

स्पष्टीकरण:

  • Object.entries()जैसे कोई ऑब्जेक्ट लेता है { a: 1, b: 2, c: 3 }और इसे कुंजी-मूल्य जोड़े की एक सरणी में बदल देता है [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]:।

  • इसके साथ for ... ofहम निर्मित सरणी की प्रविष्टियों पर लूप कर सकते हैं।

  • चूँकि हम इस बात की गारंटी देते हैं कि प्रत्येक पुनरावृत्त सरणी आइटम अपने आप में एक दो-प्रविष्टि सरणी है, इसलिए हम सीधे और अपने पहले और दूसरे आइटम को चर असाइन करने के लिए विनाशकारी का उपयोग कर सकते हैं ।keyvalue


दुखद बात यह है कि लोग अभी भी
एडवर्ड

मैं दर्द से वाकिफ हूं। बैबेल और पॉलीफिल.आईओ इसे हल करते हैं, लेकिन यह सुखद है।
लीलो

19

आप ऐसा कुछ कर सकते हैं:

dictionary = {'ab': {object}, 'cd':{object}, 'ef':{object}}
var keys = Object.keys(dictionary);

for(var i = 0; i < keys.length;i++){
   //keys[i] for key
   //dictionary[keys[i]] for the value
}

3
सुंदर! मुझे यह पसंद है कि आपके उत्तर ECMAscript 5 में स्वीकृत और सबसे उत्क्रमित उत्तर के बावजूद कैसे काम करता है, यह कहना संभव नहीं है। आप सभी बहुत अधिक उत्थान के लायक हैं।
liljoshu

18

इसे इस्तेमाल करे:

var value;
for (var key in dictionary) {
    value = dictionary[key];
    // your code here...
}

9

2020 तक आपका स्वागत है * ES6 में Drools *

यहाँ कुछ बहुत पुराने उत्तर हैं - विनाशकारी का लाभ उठाएं। मेरी राय में यह एक शक के बिना एक वस्तु को पुनरावृत्त करने का सबसे अच्छा (बहुत पठनीय) तरीका है।

Object.entries(myObject).forEach(([k,v]) => {
    console.log("The key: ",k)
    console.log("The value: ",v)
})

बस एक ध्यान दें: अगर आप को बदलने के forEachसाथ mapऊपर, यह तो समस्त मानों करना संभव है। mapफिर उक्त मानों की सूची लौटाएगा, इस प्रकार संभवतः अन्य तरीकों से कोड को सरल बनाया जाएगा।
लज़ेरबेक़ी 4545

4

मुझे लगता है कि तेज और आसान तरीका है

Object.entries(event).forEach(k => {
    console.log("properties ... ", k[0], k[1]); });

बस दस्तावेज़ की जाँच करें https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries


2
इससे भी बेहतर: Object.entries (obj) .forEach (([key, value]) => {कंसोल (। ${key} ${value});});
हनी

1

स्वैगर- ui.js का उपयोग करना

तुम यह केर सकते हो -

_.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
    console.log(n, key);
 });

0

आप स्क्रिप्ट के नीचे उपयोग कर सकते हैं।

var obj={1:"a",2:"b",c:"3"};
for (var x=Object.keys(obj),i=0;i<x.length,key=x[i],value=obj[key];i++){
    console.log(key,value);
}

आउटपुट
1 ए
2 बी
सी 3


#will आउटपुट #c 3 # 1 a # 2 b
माइकल पाइपर

4
अपने उत्तर में स्पष्टीकरण जोड़ने पर विचार करें, अकेले कोड कम मददगार है। इसके अलावा, आप अपने उत्तर को संपादित कर सकते हैं, टिप्पणियों का उत्तर आपके द्वारा उपयोग किए जा रहे तरीके के उत्तर का विस्तार होना नहीं है
विक्टर

0

घोंसले को कम करने के लिए, स्वीकृत उत्तर में सुधार के रूप में, आप इसके बजाय ऐसा कर सकते हैं, बशर्ते कि चाबी विरासत में न मिली हो:

for (var key in dictionary) {
    if (!dictionary.hasOwnProperty(key)) {
        continue;
    }
    console.log(key, dictionary[key]);
}

संपादित करें: यहाँ के बारे में जानकारीObject.hasOwnProperty

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