2016-01-21 18 views
61

Tôi có một cuốn từ điển có định dạng củaLàm cách nào để lặp lại (khóa, giá trị) trong javascript?

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

Làm thế nào tôi có thể lặp qua từ điển này bằng cách làm một cái gì đó giống như

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

'cho (hãy [key, value] của Object.entries (obj)) ', cần Babel. – elclanrs

+3

[có thể trùng lặp] (http://stackoverflow.com/questions/7241878/for-in-loops-in-javascript-key-value-pairs) – Tholle

+0

@elclanrs Trong ES2016 và chưa được chuẩn hóa :-) – thefourtheye

Trả lời

100

tl; dr

  1. Trong ECMAScript 5 , Điều đó là không thể.
  2. Trong ECMAScript 2015, có thể với Map s.
  3. Trong ECMAScript 2017, nó sẽ có sẵn.

ECMAScript 5:

Không, không phải của nó có thể với các đối tượng.

Bạn có thể phải lặp với for..in, hoặc Object.keys, như thế này

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

Lưu ý: Điều kiện if trên là cần thiết, chỉ khi bạn muốn lặp các thuộc tính đó là dictionary đối tượng rất riêng. Bởi vì for..in sẽ lặp qua tất cả các thuộc tính đếm được kế thừa.

Hoặc

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

ECMAScript 2015

Trong ECMAScript năm 2015, bạn có thể sử dụng Map đối tượng và lặp chúng với Map.prototype.entries. Trích dẫn ví dụ từ trang đó,

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"] 

Hoặc lặp với for..of, như

'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); 
} 

Output này

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

Hoặc

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

Output

0 foo 
1 bar 
{} baz 

ECMAScript 2017

ECMAScript 2017 sẽ giới thiệu một chức năng mới Object.entries. Bạn có thể sử dụng điều này để lặp lại đối tượng như bạn muốn.

'use strict'; 

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

Output

a 1 
b 2 
c 3 
+2

Chức năng bản đồ trong ECMA 2015 thật tuyệt vời. Cảm ơn bạn đã giữ cho bài đăng của bạn luôn được cập nhật. +1. – RBT

4

Hãy thử điều này:

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

Hãy thử điều này:

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"} 
0

Bạn có thể làm một cái gì đó như thế này:

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 
} 
12

Kể từ ES2017 (vì vậy hãy cẩn thận với browser support) các Object.entries() phương pháp được đề cập trong first comment của câu hỏi đã được chuẩn hóa:

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

Giải thích:

  • Object.entries() mất một đối tượng như { a: 1, b: 2, c: 3 } và biến nó thành một loạt các cặp khóa-giá trị: [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]

  • Với for ... of chúng ta có thể lặp qua tất cả các entry đó tạo mảng

  • Vì chúng ta đang đảm bảo rằng mỗi mục mảng nên lặp là một-entry-mảng hai, chúng ta có thể sử dụng destructuring để chỉ định trực tiếp các biến keyvalue cho mục đầu tiên và thứ hai của nó.

1

sử dụng vênh vang-ui.js

bạn có thể làm điều này -

_.forEach({ 'a': 1, 'b': 2 }, function(n, key) { 
    console.log(n, key); 
}); 
Các vấn đề liên quan