Lodash group by multiple properties if property value is true

前端 未结 8 1905
执笔经年
执笔经年 2020-12-10 02:20

I have an array of vehicles that need to be grouped by make and model, only if the \'selected\' property is true. The resulting object should contain properties for make mod

相关标签:
8条回答
  • 2020-12-10 02:57

    You don't need to reiterate all the array object. with loadash, you can make simple as below:

    _.mapValues(_.groupBy(object, 'yourKeys'))
    
    0 讨论(0)
  • 2020-12-10 02:59

    You can use Array.prototype.reduce(), and do it in one loop O(n):

    var arr = [{"id":1,"selected":true,"makeCode":"Make-A","modelCode":"Model-a","trimCode":"trim-a","yearCode":"2012"},{"id":2,"selected":false,"makeCode":"Make-A","modelCode":"Model-a","trimCode":"trim-a","yearCode":"2013"},{"id":3,"selected":true,"makeCode":"Make-B","modelCode":"Model-c","trimCode":"trim-a","yearCode":"2014"},{"id":25,"selected":true,"makeCode":"Make-C","modelCode":"Model-b","trimCode":"trim-b","yearCode":"2012"},{"id":26,"selected":true,"makeCode":"Make-C","modelCode":"Model-b","trimCode":"trim-a","yearCode":"2013"},{"id":29,"selected":false,"makeCode":"Make-A","modelCode":"Model-g","trimCode":"trim-a","yearCode":"2013"},{"id":2,"selected":true,"makeCode":"Make-A","modelCode":"Model-h","trimCode":"trim-a","yearCode":"2013"}];
    
    var result = arr.reduce(function(map, obj) {
      if(!obj.selected) {
        return map;
      }
      
      var makeCode = map[obj.makeCode] = map[obj.makeCode] || {};
      
      var modelCode = makeCode[obj.modelCode] = makeCode[obj.modelCode] || { count: 0 };
      
      modelCode.count++;
      
      return map;
    }, Object.create(null));
    
    console.log(result);

    A more readable, and modern version using destructuring:

    const arr = [{"id":1,"selected":true,"makeCode":"Make-A","modelCode":"Model-a","trimCode":"trim-a","yearCode":"2012"},{"id":2,"selected":false,"makeCode":"Make-A","modelCode":"Model-a","trimCode":"trim-a","yearCode":"2013"},{"id":3,"selected":true,"makeCode":"Make-B","modelCode":"Model-c","trimCode":"trim-a","yearCode":"2014"},{"id":25,"selected":true,"makeCode":"Make-C","modelCode":"Model-b","trimCode":"trim-b","yearCode":"2012"},{"id":26,"selected":true,"makeCode":"Make-C","modelCode":"Model-b","trimCode":"trim-a","yearCode":"2013"},{"id":29,"selected":false,"makeCode":"Make-A","modelCode":"Model-g","trimCode":"trim-a","yearCode":"2013"},{"id":2,"selected":true,"makeCode":"Make-A","modelCode":"Model-h","trimCode":"trim-a","yearCode":"2013"}];
    
    const result = arr.reduce((acc, { selected, makeCode, modelCode }) => {
      if(!selected) return acc;
      
      if(!acc[makeCode]) acc[makeCode] = {};
      
      const make = acc[makeCode];
      
      if(!make[modelCode]) make[modelCode] = { count: 0 };
      
      make[modelCode].count++;
      
      return acc;
    }, Object.create(null));
    
    console.log(result);

    0 讨论(0)
提交回复
热议问题