2016-11-10 22 views
0

給定一個這樣的數組,我將如何獲得特定類別中所有圖表的計數。每個類別可以有多個或沒有組。嵌套js對象中物品的計數長度

{ 
    "categories":[ 
     { 
     "title":"category 1", 
     "id":"cat1", 
     "groups":[ 
      { 
       "title":"group 1", 
       "id":"grp1", 
       "charts":[ 
        { 
        "title":"chart 1", 
        "id":"chart1", 
        "type":"line" 
        } 
       ] 
      } 
     ] 
     }, 
     { 
     "title":"category 2", 
     "id":"cat2", 
     "charts":[ 
      { 
       "title":"chart 2", 
       "id":"chart2", 
       "type":"line" 
      } 
     ] 
     }, 
     { 
     "title":"category 3", 
     "id":"cat3", 
     "charts":[ 
      { 
       "title":"chart 3", 
       "id":"chart3", 
       "type":"line" 
      } 
     ] 
     } 
    ] 
} 
+0

只是循環的類別數組中的元素和計數。你試過什麼了? – Archer

回答

1

是單行好嗎?

假設數據是你的JSON結構:

data.categories 
    .map(c => [ 
     c.title, 
     c.groups ? 
      c.groups.map(g => g.charts.length).reduce((a, b) => a+b) : 
      c.charts.length 
    ]) 
+0

謝謝,但需要支持ie9。優雅的解決方案雖然 – DavidB

+0

如果您用舊式功能替換箭頭功能,它仍然可以工作 – fafl

1

var object = { 
 
    "categories": [{ 
 
    "title": "category 1", 
 
    "id": "cat1", 
 
    "groups": [{ 
 
     "title": "group 1", 
 
     "id": "grp1", 
 
     "charts": [{ 
 
     "title": "chart 1", 
 
     "id": "chart1", 
 
     "type": "line" 
 
     }] 
 
    }] 
 
    }, { 
 
    "title": "category 2", 
 
    "id": "cat2", 
 
    "charts": [{ 
 
     "title": "chart 2", 
 
     "id": "chart2", 
 
     "type": "line" 
 
    }] 
 
    }, { 
 
    "title": "category 3", 
 
    "id": "cat3", 
 
    "charts": [{ 
 
     "title": "chart 3", 
 
     "id": "chart3", 
 
     "type": "line" 
 
    }] 
 
    }] 
 
} 
 
var groupPerCategories = []; 
 

 
object.categories.forEach(function(category) { 
 
    var tot = 0; 
 
    if (category.groups != undefined) { 
 
    category.groups.forEach(function(group) { 
 
     if(group.charts != undefined){ 
 
      tot += group.charts.length; 
 
     } 
 
    }); 
 
    } 
 
    if (category.charts != undefined) { 
 
    tot += category.charts.length; 
 
    } 
 
    console.log(tot); 
 
});

0

你可以指望使用默認的屬性。

var data = { "categories": [{ "title": "category 1", "id": "cat1", "groups": [{ "title": "group 1", "id": "grp1", "charts": [{ "title": "chart 1", "id": "chart1", "type": "line" }] }] }, { "title": "category 2", "id": "cat2", "charts": [{ "title": "chart 2", "id": "chart2", "type": "line" }] }, { "title": "category 3", "id": "cat3", "charts": [{ "title": "chart 3", "id": "chart3", "type": "line" }] }] }, 
 
    count = {}; 
 

 
data.categories.forEach(function (a) { 
 
    var countCharts = function (r, a) { 
 
     return r + (a.charts || []).length; 
 
    }; 
 
    count[a.title] = (count[a.title] || 0) + 
 
     (a.groups ||[]).reduce(countCharts, 0) + 
 
     countCharts(0, a); 
 
}); 
 

 
console.log(count);

0

希望這將幫助你:)

var categories = [ 
 
     { 
 
     "title":"category 1", 
 
     "id":"cat1", 
 
     "groups":[ 
 
      { 
 
       "title":"group 1", 
 
       "id":"grp1", 
 
       "charts":[ 
 
        { 
 
        "title":"chart 1", 
 
        "id":"chart1", 
 
        "type":"line" 
 
        } 
 
       ] 
 
      } 
 
     ] 
 
     }, 
 
     { 
 
     "title":"category 2", 
 
     "id":"cat2", 
 
     "charts":[ 
 
      { 
 
       "title":"chart 2", 
 
       "id":"chart2", 
 
       "type":"line" 
 
      } 
 
     ] 
 
     }, 
 
     { 
 
     "title":"category 3", 
 
     "id":"cat3", 
 
     "charts":[ 
 
      { 
 
       "title":"chart 3", 
 
       "id":"chart3", 
 
       "type":"line" 
 
      }, 
 
      { 
 
       "title":"chart 3", 
 
       "id":"chart3", 
 
       "type":"line" 
 
      }, 
 
      { 
 
       "title":"chart 3", 
 
       "id":"chart3", 
 
       "type":"line" 
 
      } 
 
     ] 
 
     }, 
 
    { 
 
     "title":"category 4", 
 
     "id":"cat4", 
 
     "groups":[ 
 
      { 
 
       "title":"group 4", 
 
       "id":"grp4", 
 
       "charts":[ 
 
        { 
 
        "title":"chart 1", 
 
        "id":"chart1", 
 
        "type":"line" 
 
        }, 
 
        { 
 
        "title":"chart 1", 
 
        "id":"chart1", 
 
        "type":"line" 
 
        } 
 
       ] 
 
      } 
 
     ] 
 
     } 
 
    ]; 
 

 

 
function countCategoryItems(data, category) { 
 
    if(!data) return 0 
 
    if(!category) return 0 
 

 
    var cat = _.filter(data, function(obj){ return obj.title == category; }); 
 
    if(!cat.length) return 0 
 

 
    var groups = cat[0].groups || [] 
 
    if(!groups.length) return cat[0].charts.length 
 
    
 
    var count = 0 
 
    for (var i=0;i<groups.length;i++) { 
 
     count += groups[i].charts.length 
 
    } 
 
    
 
    return count 
 
} 
 

 
$(function() { 
 
console.log(countCategoryItems(categories, 'category 1')) 
 
console.log(countCategoryItems(categories, 'category 2')) 
 
console.log(countCategoryItems(categories, 'category 3')) 
 
console.log(countCategoryItems(categories, 'category 4')) 
 
})
<script src="http://underscorejs.org/underscore.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>