【问题标题】:loop through a json object and count elements with the same value in different arrays循环遍历一个json对象并计算不同数组中具有相同值的元素
【发布时间】:2012-08-13 22:46:16
【问题描述】:

我想遍历一个 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×3 1002×2 1003×1 1004×1 2001×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

        }
    }
}

【问题讨论】:

    标签: arrays json count for-in-loop


    【解决方案1】:

    只需使用一个对象将值存储为键并递增它:

    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);
    

    【讨论】:

    • 太好了,这就是我一直在寻找的(要求注意常规形式的 if 语句是否太多?我没有那么先进,想了解你做了什么)
    • 我使用的是三元运算符,它使事情变得更短,它与:if(id[a.articleId]) { ...} else {...} 相同
    【解决方案2】:

    这是一个简单的方法,使用 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 现在是您想要的关联数组。

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 2019-12-17
      • 2022-11-03
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      相关资源
      最近更新 更多