简体   繁体   English

对具有匹配值的JSON键进行排序和合并

[英]Sort and merge JSON keys with matching values

My JSON looks like this: 我的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
  }
]    

What I'm trying to do is group/merge each type that has a date with the same year & month (the first 7 characters in the date string) and get the sum of those qty 's. 我正在试图做的是组/合并的每个type具有date与同一年和一个月(在第7个字符date字符串),并得到这些的总和qty的。 The output should look like this: 输出应如下所示:

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

There are several similar questions I've found here but haven't come across one that does exactly what I'm looking for. 我在这里找到了几个类似的问题,但没有遇到一个完全符合我要寻找的问题。 I have played around with lots of code borrowed from different examples but can't quite seem to get the results I need. 我玩了很多从不同示例中借来的代码,但是似乎无法获得所需的结果。 I'm not home now, therefore I can't paste any code I've tried at the moment but I'm asking for help in hopes to have an answer/solution to test out later 我现在不在家,因此无法粘贴目前尝试的任何代码,但我正在寻求帮助,希望以后能找到答案/解决方案进行测试

This is easily handled by creating a custom object that has properties named with your unique combinations (ie type + first 7 of date). 通过创建一个具有用您的唯一组合命名的属性(即类型+日期的前7个)的自定义对象,可以轻松地解决此问题。

Loop through your array and check if your "holder" object has an existing property named with your unique identifier. 遍历数组,并检查您的“ holder”对象是否具有使用唯一标识符命名的现有属性。 If it has the property already, then increment the quantity, otherwise add a new item. 如果已经具有该属性,则增加数量,否则添加一个新项目。

After the holder is completely built, clear your array, then loop through the properties of the holder and push them back on to your array. 支架完全构建之后,清除阵列,然后遍历支架的属性,然后将其推回阵列。

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

Alternative solution: 替代解决方案:

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

One more to mix which I think this is the longest answer of them all :-) 我认为这是所有人当中最长的答案:-)

  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 + " <br>"); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="result"></div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM