我正在尝试解析Javascript对象的子对象以计算相同的子对象的数量,并返回具有这些计数的新JSON对象。这可能不太清楚,所以这里是fiddle。
考虑到小提琴中的crsListData
,我想回复一下:
objToReturn = [
{
key: "Consigned",
values:
[
{ mapKey: 2007 (4), mapVal: [["Ford F-150 (3)"], ["Honda Civic (1)"]] },
{ mapKey: 2011 (1), mapVal: "Toyota Camry (1)" },
{ mapKey: 2005 (1), mapVal: "Dodge RAM (1)" }
]
},
{
key: "Run",
values:
[
{ mapKey: 2007 (2), mapVal: "Ford F-150 (2)" },
{ mapKey: 2011 (1), mapVal: "Toyota Camry (1)" }
]
},
{
key: "Sold",
values:
[
{ mapKey: 2007 (1), mapVal: "Ford F-150 (1)" },
{ mapKey: 2011 (1), mapVal: "Toyota Camry (1)" }
]
}
];
如果您在小提琴中注意到,我已经评论了关于mapKey和mapValue的部分内容。它们将由从选择选项获得的函数参数确定,按模型(计数)/年份(计数)或年份(计数)/模型(计数)排序。
我的最终目标是生成一个基本上如下所示的HTML树:
寄售(寄售#)
运行(运行#)
年份的顺序应基于该年度的模型总数(最高#先)。同样,多年来模型的顺序应按最高计数排序。
或者,如果用户选择模型/年份进行分组,我想生成:
寄售(寄售#)
运行(运行#)
这个的顺序也将基于计数。如果您需要任何澄清,请告诉我!谢谢!
答案 0 :(得分:4)
您想要做的事情的根本很简单。您想要按某些属性对数据进行分组。让它看起来很复杂的是你想在几个层面上做到这一点。
首先,您有3组数据"托运","运行","已销售"。解决它,你解决所有问题。
首先,您按车型分类。在模型中,您可以按年份分组。同样,它的核心是你想要通过某些属性对数据进行分组。
你可以使用这样的函数来做到这一点:
var cars = [
{ year: 2007, model: "Ford F-150" },
{ year: 2011, model: "Toyota Camry" },
{ year: 2007, model: "Ford F-150" },
{ year: 2007, model: "Ford F-150" },
{ year: 2005, model: "Dodge RAM" }
];
function groupBy(propertyName, array) {
var groupedElements = {};
for(var i = 0; i < array.length; i++) {
var element = array[i];
var value = element[propertyName];
var group = groupedElements[value];
if(group == undefined) {
group = [element];
groupedElements[value] = group;
} else {
group.push(element);
}
}
return groupedElements;
}
var result = groupBy("year", cars)
输出将是:
{
"2005": [
{
"year": 2005,
"model": "Dodge RAM"
}
],
"2007": [
{
"year": 2007,
"model": "Ford F-150"
},
{
"year": 2007,
"model": "Ford F-150"
},
{
"year": 2007,
"model": "Ford F-150"
}
],
"2011": [
{
"year": 2011,
"model": "Toyota Camry"
}
]
}
你可以在这个JSFiddle中使用它:http://jsfiddle.net/luisperezphd/jCt2k/
您可以在每个级别完成您想要执行此分组的操作。第一组逐年。然后逐个浏览每个生成组。您的计数将是值数组的length
。