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

Sort and merge JSON keys with matching values

本文关键字:排序 合并 JSON      更新时间:2023-09-26

我的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 个字符)date的每个type,并获取这些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"对象是否具有以唯一标识符命名的现有属性。如果它已经具有该属性,则增加数量,否则添加新项目。

完全构建支架后,清除数组,然后遍历持有者的属性并将它们推送回数组。

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