JavaScript цикл через json массив?
Я пытаюсь перебрать следующий массив json:
{
"id": "1",
"msg": "hi",
"tid": "2013-05-05 23:35",
"fromWho": "[email protected]"
}, {
"id": "2",
"msg": "there",
"tid": "2013-05-05 23:45",
"fromWho": "[email protected]"
}
И попробовал следующее
for (var key in data) {
if (data.hasOwnProperty(key)) {
console.log(data[key].id);
}
}
Но по какой-то причине я получаю только первую часть, значения id 1.
Есть идеи?
Ответы
Ответ 1
Ваш JSON должен выглядеть следующим образом:
var json = [{
"id" : "1",
"msg" : "hi",
"tid" : "2013-05-05 23:35",
"fromWho": "[email protected]"
},
{
"id" : "2",
"msg" : "there",
"tid" : "2013-05-05 23:45",
"fromWho": "[email protected]"
}];
Вы можете выполнить цикл над массивом следующим образом:
for(var i = 0; i < json.length; i++) {
var obj = json[i];
console.log(obj.id);
}
Или, как это (предположил Эрик), будьте осторожны с поддержкой IE
json.forEach(function(obj) { console.log(obj.id); });
Ответ 2
В коде есть несколько проблем, сначала ваш json должен выглядеть так:
var json = [{
"id" : "1",
"msg" : "hi",
"tid" : "2013-05-05 23:35",
"fromWho": "[email protected]"
},
{
"id" : "2",
"msg" : "there",
"tid" : "2013-05-05 23:45",
"fromWho": "[email protected]"
}];
Затем вы можете повторить так:
for (var key in json) {
if (json.hasOwnProperty(key)) {
alert(json[key].id);
alert(json[key].msg);
}
}
И это дает отличный результат.
Смотрите скрипку здесь: http://jsfiddle.net/zrSmp/
Ответ 3
var arr = [
{
"id": "1",
"msg": "hi",
"tid": "2013-05-05 23:35",
"fromWho": "[email protected]"
}, {
"id": "2",
"msg": "there",
"tid": "2013-05-05 23:45",
"fromWho": "[email protected]"
}
];
для каждого метода для легкой реализации.
arr.forEach(function(item){
console.log('ID: ' + item.id);
console.log('MSG: ' + item.msg);
console.log('TID: ' + item.tid);
console.log('FROMWHO: ' + item.fromWho);
});
Ответ 4
Так как я уже начал изучать его:
var data = [{
"id": "1",
"msg": "hi",
"tid": "2013-05-05 23:35",
"fromWho": "[email protected]"
}, {
"id": "2",
"msg": "there",
"tid": "2013-05-05 23:45",
"fromWho": "[email protected]"
}]
И эта функция
var iterateData =function(data){ for (var key in data) {
if (data.hasOwnProperty(key)) {
console.log(data[key].id);
}
}};
Вы можете назвать это следующим образом
iterateData(data); // write 1 and 2 to the console
Обновление после комментария Erics
Как eric указал, что цикл a for in
для массива может иметь неожиданные результаты. В упомянутом вопросе есть длинная дискуссия о плюсах и минусах.
Тест с for (var i...
Но похоже, что это совершенно экономит:
for(var i = 0; i < array.length; i += 1)
Хотя тест в хроме имел следующий результат
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);
Тест с .forEach()
По крайней мере, в хроме 30 это работает как ожидалось
var logAr = function(element, index, array) {
console.log("a[" + index + "] = " + element);
}
ar.forEach(logAr); // returns a[0] = a, a[1] = b, a[4] = c
Ссылки
Ответ 5
Он должен быть массивом, если вы хотите перебрать его. Вероятно, вам не хватает [
и ]
.
var x = [{
"id": "1",
"msg": "hi",
"tid": "2013-05-05 23:35",
"fromWho": "[email protected]"
}, {
"id": "2",
"msg": "there",
"tid": "2013-05-05 23:45",
"fromWho": "[email protected]"
}];
var $output = $('#output');
for(var i = 0; i < x.length; i++) {
console.log(x[i].id);
}
Посмотрите этот jsfiddle: http://jsfiddle.net/lpiepiora/kN7yZ/
Ответ 6
Немного поздно, но я надеюсь, что смогу помочь другим: D
Ваш json должен выглядеть так, как сказал Никлас. И тут вы идете:
for(var key in currentObject){
if(currentObject.hasOwnProperty(key)) {
console.info(key + ': ' + currentObject[key]);
}
}
если у вас многомерный массив, это ваш код:
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]);
}
}
}
Ответ 7
Это работает. Я просто добавил квадратные скобки к данным JSON. Данные:
var data = [
{
"id": "1",
"msg": "hi",
"tid": "2013-05-05 23:35",
"fromWho": "[email protected]"
},
{
"id": "2",
"msg": "there",
"tid": "2013-05-05 23:45",
"fromWho": "[email protected]"
}
]
И цикл такой:
for (var key in data) {
if (data.hasOwnProperty(key)) {
alert(data[key].id);
}
}
Ответ 8
Ну, я вижу, что у вас есть два объекта JSON, разделенных запятой. Если бы они были внутри массива ([...]
), это имело бы смысл.
И, если они находятся внутри массива, тогда вы просто будете использовать стандартный цикл "для var я = 0...". Как бы то ни было, я думаю, что он попытается получить свойство "id" строки "1", затем "id" из "hi" и т.д.
Ответ 9
Краткое решение с использованием map
и функция стрелки
var data = [{
"id": "1",
"msg": "hi",
"tid": "2013-05-05 23:35",
"fromWho": "[email protected]"
}, {
"id": "2",
"msg": "there",
"tid": "2013-05-05 23:45",
"fromWho": "[email protected]"
}];
data.map((item, i) => console.log('Index:', i, 'Id:', item.id));
Ответ 10
попробуй это
var json = [{
"id" : "1",
"msg" : "hi",
"tid" : "2013-05-05 23:35",
"fromWho": "[email protected]"
},
{
"id" : "2",
"msg" : "there",
"tid" : "2013-05-05 23:45",
"fromWho": "[email protected]"
}];
arr.forEach((item) => {
console.log('ID: ' + item.id);
console.log('MSG: ' + item.msg);
console.log('TID: ' + item.tid);
console.log('FROMWHO: ' + item.fromWho);
});
Ответ 11
Ваш for
не выглядит хорошо отформатированным. и попытайтесь поместить объекты в массив.
Я предпочитаю синтаксис цикла jquery:
$(data).each(function(){
console.log($(this).id);
});