我有一系列需要按品牌和型号分组的车辆,只有'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)
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)
如果您专注于结果,以下代码有效:
在我的情况,Brand并Item Code在性能
const products = _.groupBy(this.productsTable.data, (item) => {
return [item['Brand'], item['Item Code']];
});
Run Code Online (Sandbox Code Playgroud)
您可以使用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)
| 归档时间: |
|
| 查看次数: |
24171 次 |
| 最近记录: |