如果属性值为true,则由多个属性组成Lodash组

ner*_*daj 9 javascript lodash

我有一系列需要按品牌和型号分组的车辆,只有'selected'属性为真.生成的对象应包含make model和count的属性.使用lodash,如何将车辆对象组织到所需的结果对象中.我能够通过makeCode获取车辆对象,但我不确定如何按多个属性进行分组.

通过make代码组工作

      var vehicles = _.groupBy(response.vehicleTypes, function(item)
      {
        return item.makeCode; // how to group by model code as well
      });
Run Code Online (Sandbox Code Playgroud)

初始车辆

{
    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"
}
Run Code Online (Sandbox Code Playgroud)

结果对象

{
    Make-A: {
        Model-a: {
            count: 1
        }
    }
},

{
    Make-B: {
        Model-c: {
            count: 1
        }
    }
},
{
    Make-C: {
        Model-b: {
            count: 2
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

IOR*_*R88 26

我不确定这是否会解决您的问题,但在group_by中您可以添加允许您创建复合键的自定义逻辑.

_.chain(data).filter((item) => item.selected).groupBy((item)=>`${item.model}--${item.type}`)
Run Code Online (Sandbox Code Playgroud)

  • 天才!只需在 .value() 之后添加 .value() 即可。 (2认同)
  • 很好,这是个好主意。注意小边缘情况。假设“-”是有效字符。这个对象 `{model:'---', type:'-'}` 和这个对象 `{model:'--',type:'--'}` 将被分组,尽管它们不具有相同的属性型号和类型 (2认同)

mgu*_*ida 16

由于您已经在使用lodash,因此可以利用_.filter函数.这将仅返回where selected为true 的项.

var selectedVehicles = _.filter(response.vehicleTypes, 'selected');
Run Code Online (Sandbox Code Playgroud)

现在您已拥有该selectedVehicles阵列,您可以使用原始代码进行分组makeCode.

selectedVehicles = _.groupBy(selectedVehicles, function(item) {
  return item.makeCode;
});
Run Code Online (Sandbox Code Playgroud)

这将返回一个对象,因此我们需要遍历这些键,然后执行第二个键 groupBy

_.forEach(selectedVehicles, function(value, key) {
  selectedVehicles[key] = _.groupBy(selectedVehicles[key], function(item) {
    return item.modelCode;
  });
});
Run Code Online (Sandbox Code Playgroud)

从这里你将有一个表格的对象.我会留给你从每个阵列得到计数.

{ 'Make-A': { 'Model-a': [ ... ] },
  'Make-B': { 'Model-c': [ ... ] },
  'Make-C': { 'Model-b': [ ..., ... ] } }
Run Code Online (Sandbox Code Playgroud)


Abh*_*ade 8

如果您专注于结果,以下代码有效:

在我的情况,BrandItem Code在性能

const products = _.groupBy(this.productsTable.data, (item) => {
    return [item['Brand'], item['Item Code']];
});
Run Code Online (Sandbox Code Playgroud)

  • 并不是每个来到这里的人都会遇到与所提到的完全相同的问题。这个答案是针对这些情况的。@Dheeraj (4认同)
  • 好答案。如果你多花 10 秒才能真正注意到他要求的输出格式是不同的:) (2认同)

Ori*_*ori 7

您可以使用Array.prototype.reduce(),并在一个循环中执行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);
Run Code Online (Sandbox Code Playgroud)


小智 5

const result = _.chain(vehicles)
.filter('selected')
.groupBy('makeCode')
.mapValues(values => _.chain(values)
    .groupBy('modelCode')
    .mapValues(_.size)
    .value()
)
.value()
Run Code Online (Sandbox Code Playgroud)