【问题标题】:Sort and merge JSON keys with matching values对具有匹配值的 JSON 键进行排序和合并
【发布时间】:2014-11-17 16:23:23
【问题描述】:

我的 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
  }
]    

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

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

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

【问题讨论】:

  • 那不是 JSON,JSON 是 string 格式。这只是一个对象数组。

标签: javascript jquery arrays coffeescript


【解决方案1】:

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

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

在完全构建完持有人后,清除您的数组,然后循环浏览持有人的属性并将它们推回您的数组。

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

【讨论】:

  • +1 。但是,如果我可以建议的话,可以将element.date.slice(0, 6); 更改为element.date.slice(0, 7); 进行小改动,否则输出与预期的不太一样:)
  • 太棒了!!!我有时间在 jsfiddle 上对此进行测试,它奏效了! (当然,我必须将.slice(0, 6) 更改为.slice(0, 7))。这很简单,不像我遇到的一些笨重的东西。我知道它现在是如何工作的
【解决方案2】:

替代解决方案:

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

【讨论】:

    【解决方案3】:

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

        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>

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 1970-01-01
      • 2017-10-17
      • 2012-07-02
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多