JavaScript lặp qua mảng json?


151

Tôi đang cố gắng lặp qua mảng json sau:

{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}

Và đã thử như sau

for (var key in data) {
   if (data.hasOwnProperty(key)) {
      console.log(data[key].id);
   }
}

Nhưng vì một số lý do tôi chỉ nhận được phần đầu tiên, giá trị id 1.

Có ý kiến ​​gì không?


Có một số dấu ngoặc bị thiếu? Nó không thực sự trông giống như một mảng, bây giờ. Và bạn đã phân tích JSON?
Denys Séguret

nó là một mảng của các đối tượng? (bạn có mất tích [] hoặc họ không có ở đó không?)
lpiepiora

9
Nó không phải là JSON hay mảng.
JJJ

3
Bản sao lặp có thể có của Loop thông qua một mảng trong JavaScript
Heretic Monkey

Vui lòng thay đổi tiêu đề, đây là để lặp qua một thuộc tính đối tượng JSON, không phải là một mảng
Các trang web Taylored

Câu trả lời:


222

JSON của bạn sẽ trông như thế này:

var json = [{
    "id" : "1", 
    "msg"   : "hi",
    "tid" : "2013-05-05 23:35",
    "fromWho": "hello1@email.se"
},
{
    "id" : "2", 
    "msg"   : "there",
    "tid" : "2013-05-05 23:45",
    "fromWho": "hello2@email.se"
}];

Bạn có thể lặp qua Mảng như thế này:

for(var i = 0; i < json.length; i++) {
    var obj = json[i];

    console.log(obj.id);
}

Hoặc như thế này (được đề xuất từ ​​Eric) hãy cẩn thận với sự hỗ trợ của IE

json.forEach(function(obj) { console.log(obj.id); });

11
Hay chính xác hơn,json.forEach(function(obj) { console.log(obj.id); });
Eric

4
Trừ khi trên IE8 (như thường lệ, tất cả mọi người trừ IE;))
lpiepiora

4
Tôi nghĩ ví dụ đó có thể gây nhầm lẫn, bởi vì var json không phải là một đối tượng JSON, mà là một mảng. Trong trường hợp này, .forEach hoạt động tốt, nhưng khi bạn sử dụng đối tượng json, nó không hoạt động.
mpoletto

27

Có một vài vấn đề trong mã của bạn, đầu tiên json của bạn phải giống như:

var json = [{
"id" : "1", 
"msg"   : "hi",
"tid" : "2013-05-05 23:35",
"fromWho": "hello1@email.se"
},
{
"id" : "2", 
"msg"   : "there",
"tid" : "2013-05-05 23:45",
"fromWho": "hello2@email.se"
}];

Tiếp theo, bạn có thể lặp lại như thế này:

for (var key in json) {
if (json.hasOwnProperty(key)) {
  alert(json[key].id);
  alert(json[key].msg);
}
}

Và nó cho kết quả hoàn hảo.

Xem fiddle ở đây: http://jsfiddle.net/zrSmp/


16
var arr = [
  {
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
  }, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
  }
];

phương pháp forEach để thực hiện dễ dàng.

arr.forEach(function(item){
  console.log('ID: ' + item.id);
  console.log('MSG: ' + item.msg);
  console.log('TID: ' + item.tid);
  console.log('FROMWHO: ' + item.fromWho);
});

16

thử cái này

var json = [{
    "id" : "1", 
    "msg"   : "hi",
    "tid" : "2013-05-05 23:35",
    "fromWho": "hello1@email.se"
},
{
    "id" : "2", 
    "msg"   : "there",
    "tid" : "2013-05-05 23:45",
    "fromWho": "hello2@email.se"
}];

json.forEach((item) => {
  console.log('ID: ' + item.id);
  console.log('MSG: ' + item.msg);
  console.log('TID: ' + item.tid);
  console.log('FROMWHO: ' + item.fromWho);
});

10

Vì tôi đã bắt đầu tìm hiểu về nó:

var data = [{
    "id": "1",
    "msg": "hi",
    "tid": "2013-05-05 23:35",
    "fromWho": "hello1@email.se"
}, {
    "id": "2",
    "msg": "there",
    "tid": "2013-05-05 23:45",
    "fromWho": "hello2@email.se"
}]

Và chức năng này

var iterateData =function(data){   for (var key in data) {
       if (data.hasOwnProperty(key)) {
          console.log(data[key].id);
       }
    }};

Bạn có thể gọi nó như thế này

iterateData(data); // write 1 and 2 to the console

Cập nhật sau khi nhận xét Erics

Như eric đã chỉ ra một for invòng lặp cho một mảng có thể có kết quả bất ngờ . Câu hỏi được tham khảo có một cuộc thảo luận dài về ưu và nhược điểm.

Kiểm tra với (var i ...

Nhưng có vẻ như follwing khá tiết kiệm:

for(var i = 0; i < array.length; i += 1)

Mặc dù một thử nghiệm trong chrome đã có kết quả như sau

var ar = [];
ar[0] = "a"; 
ar[1] = "b";
ar[4] = "c";

function forInArray(ar){ 
     for(var i = 0; i < ar.length; i += 1) 
        console.log(ar[i]);
}

// calling the function
// returns a,b, undefined, undefined, c, undefined
forInArray(ar); 

Kiểm tra với .forEach()

Ít nhất trong chrome 30 điều này hoạt động như mong đợi

var logAr = function(element, index, array) {
    console.log("a[" + index + "] = " + element);
}
ar.forEach(logAr); // returns a[0] = a, a[1] = b, a[4] = c

Liên kết


2
-1 - for ... in các vòng lặp không nên được sử dụng cho các mảng
Eric

Hiểu mảng sử dụng for each. for ... in ...là một cấu trúc ngôn ngữ để liệt kê các khóa đối tượng theo thứ tự tùy ý. Đó không phải là cấu trúc phù hợp cho một mảng.
Eric

9

Nó đang làm việc. Tôi vừa thêm dấu ngoặc vuông vào dữ liệu JSON. Dữ liệu là:

var data = [
    { 
        "id": "1",
        "msg": "hi", 
        "tid": "2013-05-05 23:35", 
        "fromWho": "hello1@email.se" 
    }, 
    { 
        "id": "2", 
        "msg": "there", 
        "tid": "2013-05-05 23:45", 
        "fromWho": "hello2@email.se"
    }
]

Và vòng lặp là:

for (var key in data) {
   if (data.hasOwnProperty(key)) {
         alert(data[key].id);
   }
} 

6

Nó phải là một mảng nếu bạn muốn lặp lại nó. Bạn rất có thể mất tích [].

var x = [{
    "id": "1",
        "msg": "hi",
        "tid": "2013-05-05 23:35",
        "fromWho": "hello1@email.se"
}, {
    "id": "2",
        "msg": "there",
        "tid": "2013-05-05 23:45",
        "fromWho": "hello2@email.se"
}];

var $output = $('#output');
for(var i = 0; i < x.length; i++) {
    console.log(x[i].id);
}

Kiểm tra jsfiddle này: http://jsfiddle.net/lpiepiora/kN7yZ/


5

Hơi muộn một chút nhưng tôi hy vọng tôi có thể giúp đỡ người khác: D

json của bạn cần trông giống như một cái gì đó Niklas đã nói. Và sau đó bạn đến đây:

for(var key in currentObject){
        if(currentObject.hasOwnProperty(key)) {
          console.info(key + ': ' + currentObject[key]);
        }
   }

nếu bạn có một mảng nhiều chiều, đây là mã của bạn:

for (var i = 0; i < multiDimensionalArray.length; i++) {
    var currentObject = multiDimensionalArray[i]
    for(var key in currentObject){
            if(currentObject.hasOwnProperty(key)) {
              console.info(key + ': ' + currentObject[key]);
            }
       }
}

3

Chà, tất cả những gì tôi có thể thấy là bạn có hai đối tượng JSON, được phân tách bằng dấu phẩy. Nếu cả hai đều nằm trong một mảng ( [...]) thì sẽ có ý nghĩa hơn.

Và, nếu chúng nằm trong một mảng, thì bạn sẽ chỉ sử dụng loại vòng lặp "for var i = 0 ..." tiêu chuẩn. Vì vậy, tôi nghĩ rằng nó sẽ cố gắng truy xuất thuộc tính "id" của chuỗi "1", sau đó là "id" của "hi", v.v.


2

Một giải pháp ngắn sử dụng mapchức năng mũi tên

var data = [{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}];
data.map((item, i) => console.log('Index:', i, 'Id:', item.id));

Và để bao gồm các trường hợp khi tài sản "id"không có mặt sử dụng filter:

var data = [{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}, {
  "msg": "abcde",
  "tid": "2013-06-06 23:46",
  "fromWho": "hello3@email.se"
}];

data.filter(item=>item.hasOwnProperty('id'))
                .map((item, i) => console.log('Index:', i, 'Id:', item.id));


0

oh của tôi ... tại sao mọi người làm điều này rất khó khăn !!?

đoạn dữ liệu của bạn cần được mở rộng một chút và nó phải theo cách này để trở thành json thích hợp. chú ý tôi chỉ bao gồm thuộc tính tên mảng "item"

{"item":[
{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}]}

kịch bản java của bạn chỉ đơn giản là

var objCount = json.item.length;
for ( var x=0; x < objCount ; xx++ ) {
    var curitem = json.item[x];
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.