2015-11-07 3 views
0

Я не очень силен с Javascript. У меня есть вложенный массив, который представляет собой JSON-представление бэкэнд-данных. Он показывает список доказательств и изображений, используемых в каждом доказательстве. Его внешний вид, как показано ниже:javascript: цикл через вложенный объект/массив и добавление свойства

var project = [{ 
    "proof":"Proof_1", 
    "images":[ 
     { 
      "image_id":"12469", 
      "name":"1911791794.jpg", 
     }, 
     { 
      "image_id":"12470", 
      "name":"1911802897.jpg" 
     }, 
     { 
      "image_id":"12471", 
      "name":"1911761073.jpg" 
     } 
}, 
{ 
    "proof":"Proof_2", 
    "images":[ 
     { 
      "image_id":"12469", 
      "name":"1911791794.jpg", 
     }, 
     { 
      "image_id":"12470", 
      "name":"1911802897.jpg" 
     } 
}]; 

Я хочу добавить IMAGE_COUNT каждого доказательства секции, так что модифицированная структура данных выглядит следующим образом:

var project = [{ 
    "proof":"Proof_1", 
    "image_count": 3, //<----this is new property I want to add 
    "images":[ 
     { 
      "image_id":"12469", 
      ... 

Я проверил некоторые ответы, но из-за мое отсутствие понимания javascript iteration правильно Я не могу это сделать.

Когда я: для (доказательство в проекте) { console.log (proof); }

Я просто получаю 0,1,2 ... и т.д. напечатан. Я не получаю это, поэтому я помогаю кому-то в SO, поможет мне понять, как добавить это свойство, которое я хочу.

Заранее спасибо.

+0

Если вы нашли решение, пожалуйста, отметьте его как принятый ответ. –

ответ

1

Вы можете использовать .map или простой цикл

var projects = [{ 
 
    "proof": "Proof_1", 
 
    "images": [{ 
 
    "image_id": "12469", 
 
    "name": "1911791794.jpg", 
 
    }, { 
 
    "image_id": "12470", 
 
    "name": "1911802897.jpg" 
 
    }, { 
 
    "image_id": "12471", 
 
    "name": "1911761073.jpg" 
 
    }] 
 
}, { 
 
    "proof": "Proof_2", 
 
    "images": [{ 
 
    "image_id": "12469", 
 
    "name": "1911791794.jpg", 
 
    }, { 
 
    "image_id": "12470", 
 
    "name": "1911802897.jpg" 
 
    }] 
 
}]; 
 

 
projects = projects.map(function (element) { 
 
    element.image_count = element.images.length; 
 
    return element; 
 
}); 
 

 
console.log(projects); 
 

 
var len = projects.length, i; 
 
for (i = 0; i < len; i++) { 
 
    projects[i].image_count = projects[i].images.length; 
 
} 
 

 
console.log(projects);

2

Вы можете воспользоваться Array.prototype.map способом:

project = project.map(function (item) { 
    item.image_count = item.images.length; 
    return item; 
}); 

Working demo.

Кроме того, как указал @Sebastian Lasse, вы должны назвать свой массив, используя множественную форму, чтобы избежать путаницы (projects вместо project).

+1

правый. И вы должны назвать свои массивы во множественном числе - «проекты». Это соглашение, чтобы избежать путаницы. – sebilasse

+0

Почему downvote? Это смешно. xD –

+0

Как я и ожидал. Нет причин. : D –

1

Вы могли бы - после коррекции отсутствующей ] ошибки в вашем JSON - это сделать:

project.forEach(function(proof) { 
    proof.image_count = proof.images.length; 
}) 

демо ->http://jsfiddle.net/dLd8wvpb/

+1

На самом деле, он хотел «image_count» вместо 'imageCount'. –

+1

@ DanielKmak, спасибо за это, думаю, я слишком охарактеризовался в camelCase :( – davidkonrad

+0

Да, я тоже хотел сделать это сначала. 'CamelCase' просто слишком хорош.: D –

Смежные вопросы