Цикл по объекту json и подсчет элементов с одинаковым значением в разных массивах
Я хочу перебрать объект json и посчитать элементы с одинаковым значением в разных массивах. Вот образец моего объекта
var testconn =
{"_total": 3,
"values":
[
{
"articlesRead": [
{ "articleId": 1001 },
{ "articleId": 1002 },
{ "articleId": 1003 },
{ "articleId": 1004 },
{ "articleId": 1005 },
{ "articleId": 1006 }
]
},
{
"articlesRead": [
{ "articleId": 1001 },
{ "articleId": 1002 },
{ "articleId": 2001 },
{ "articleId": 2002 },
{ "articleId": 2003 },
{ "articleId": 2004 }
]
},
{
"articlesRead": [
{ "articleId": 1001 },
{ "articleId": 3001 },
{ "articleId": 3002 },
{ "articleId": 3003 },
{ "articleId": 3004 },
{ "articleId": 3005 }
]
}
]
}
Я хочу посчитать, сколько ID существует в массиве. Так что для этого примера у меня должно быть: 1001 x 3 1002 x 2 1003 x 1 1004 x 1 2001 x 1 и т. Д.
Я перебираю свой объект вот так
for (i = 0; i < testconn.values.length; i++) {
var c = testconn.values[i];
for (j = 0; j < c.articlesRead.length; j++) {
var a = c.articlesRead[j];
for (var key in a) {
if (a[key] is bigger then 1) {
count a[key]
}
return number of
}
}
}
2 ответа
Решение
Просто используйте объект, чтобы сохранить значение в качестве ключа и увеличить его:
var id={};
for (var i = 0; i < testconn._total; i++) {
var c = testconn.values[i];
for (j = 0; j < c.articlesRead.length; j++) {
var a = c.articlesRead[j];
id[a.articleId]= id[a.articleId] ? ++id[a.articleId]: 1;
}
}
console.log(id);
Вот простой способ сделать это, используя 4 вложенных цикла, хотя, возможно, и не самый эффективный.
var list = testconn.values;
var dict = {};
for(var i in list){
for(var j in list[i]){
for(var k in list[i][j]){
for(var l in list[i][j][k]){
var key = list[i][j][k][l];
dict[key] = dict[key] ? ++dict[key] : 1;
}
}
}
}
Dict теперь ассоциативный массив того, что вы хотите.