цикл через объект 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 }
            ]
        }
    ]
}

Я хочу подсчитать, сколько идентификаторов существует в массиве. Итак, для этого примера у меня должно быть: 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

        }
    }
}

person pwavg    schedule 17.08.2012    source источник


Ответы (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);
person shi    schedule 17.08.2012
comment
Отлично, это то, что я искал (много ли просить отметить оператор if в его обычной форме? Я не настолько продвинут и хотел бы понять, что вы сделали) - person pwavg; 17.08.2012
comment
Я использую тернарный оператор, он делает вещи короче, это то же самое, что: if(id[a.articleId]) { ...} else {...} - person shi; 17.08.2012

Вот простой способ сделать это, используя 4 вложенных цикла for, возможно, не самый эффективный.

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 теперь представляет собой ассоциативный массив того, что вы хотите.

person SpiXel    schedule 17.08.2012