使用匹配值对JSON键进行排序和合并

我的JSON看起来像这样:

json = [ { type: "big" date: "2012-12-08" qty: 6 } { type: "small" date: "2012-12-08" qty: 9 } { type: "big" date: "2012-12-15" qty: 4 } { type: "small" date: "2012-12-07" qty: 7 } { type: "small" date: "2012-11-07" qty: 3 } ] 

我要做的是分组/合并每个具有相同年份和月份的date字符串中的前7个字符)并获得这些qty的总和。 输出应如下所示:

 json = [ { type: "big" date: "2012-12" qty: 10 } { type: "small" date: "2012-12" qty: 16 } { type: "small" date: "2012-11" qty: 3 } ] 

我在这里发现了几个类似的问题,但没有找到一个完全符合我要求的问题。 我玩了很多从不同的例子借来的代码,但似乎无法得到我需要的结果。 我现在不在家,因此我无法粘贴我目前尝试过的任何代码,但我正在寻求帮助,希望有一个答案/解决方案以便稍后测试

这可以通过创建一个自定义对象来轻松处理,该对象具有以您的唯一组合命名的属性(即类型+日期的前7个)。

遍历您的数组并检查您的“holder”对象是否具有以您的唯一标识符命名的现有属性。 如果它已经具有该属性,则增加数量,否则添加新项目。

在完全构建支架后,清除arrays,然后循环支架的属性并将它们推回到arrays。

 var holder = {}; var json = [ { type: "big", date: "2012-12-08", qty: 6 }, { type: "small", date: "2012-12-08", qty: 9 }, { type: "big", date: "2012-12-15", qty: 4 }, { type: "small", date: "2012-12-07", qty: 7 }, { type: "small", date: "2012-11-07", qty: 3 } ]; json.forEach(function(element) { var identifier = element.type + element.date.slice(0, 7); if (holder[identifier]) { holder[identifier].qty += element.qty; } else { holder[identifier] = element; }; }); json = []; for(var identifier in holder) { json.push(holder[identifier]); } console.log(json); 

替代方案:

 var result = []; $(json).each(function (i, e){ var search = $.grep(result, function(elm){ return e.type == elm.type && e.date.substring(0, 7) == elm.date; }); if(search.length == 0) result.push({ type: e.type, date: e.date.substring(0, 7), qty: e.qty }); else search[0].qty += e.qty; }); 

还有一个混合,我认为这是他们所有人中最长的答案:-)

  var sortedArray = []; function traverseArray(element, index, array) { var found = false; for (i = 0; i < sortedArray.length; i++) { if (sortedArray[i].type === element.type) { if (sortedArray[i].date.substring(0, 7) === element.date.substring(0, 7)) { sortedArray[i].qty = (sortedArray[i].qty + element.qty); console.log(element); found = true; } } } if (!found) sortedArray.push(element); } var data = [{ type: "big", date: "2012-12-08", qty: 6 }, { type: "small", date: "2012-12-08", qty: 9 }, { type: "big", date: "2012-12-15", qty: 4 }, { type: "small", date: "2012-12-07", qty: 7 }, { type: "small", date: "2012-11-07", qty: 3 }]; data.forEach(traverseArray); sortedArray.forEach(print); function print(element, index, array) { var line = "[ type: " + element.type + ", date: " + element.date + ", qty: " + element.qty + "]"; $("#result").append(line + " 
"); }