Sort and merge JSON keys with matching values

后端 未结 3 1077
一个人的身影
一个人的身影 2021-01-23 13:19

My JSON looks like this:

json = [
  {
    type: \"big\"
    date: \"2012-12-08\"
    qty: 6
  }
  {
    type: \"small\"
    date: \"2012-12-08\"
    qty: 9
  }
          


        
相关标签:
3条回答
  • 2021-01-23 13:56

    This is easily handled by creating a custom object that has properties named with your unique combinations (i.e. type + first 7 of date).

    Loop through your array and check if your "holder" object has an existing property named with your unique identifier. 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);

    0 讨论(0)
  • 2021-01-23 14:02

    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>

    0 讨论(0)
  • 2021-01-23 14:06

    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;
    });
    
    0 讨论(0)
提交回复
热议问题