Javascript 如果属性值为true,则按多个属性对Lodash进行分组

Javascript 如果属性值为true,则按多个属性对Lodash进行分组,javascript,lodash,Javascript,Lodash,我有一个需要按品牌和型号分组的车辆数组,只有在“selected”属性为true时才可以。结果对象应包含make model和count的属性。使用lodash,如何将车辆对象组织到所需的结果对象中。我能够按makeCode对车辆对象进行分组,但我不确定如何按多个属性进行分组 按代码分组使代码生效 初始车辆 结果对象 由于您已经在使用lodash,因此可以利用该功能。这将仅返回所选为真的项目 var selectedVehicles = _.filter(response.vehicleType

我有一个需要按品牌和型号分组的车辆数组,只有在“selected”属性为true时才可以。结果对象应包含make model和count的属性。使用lodash,如何将车辆对象组织到所需的结果对象中。我能够按makeCode对车辆对象进行分组,但我不确定如何按多个属性进行分组

按代码分组使代码生效

初始车辆

结果对象


由于您已经在使用lodash,因此可以利用该功能。这将仅返回所选
为真的项目

var selectedVehicles = _.filter(response.vehicleTypes, 'selected');
现在您有了
selectedVehicles
数组,您可以使用原始代码通过
makeCode
进行分组

selectedVehicles = _.groupBy(selectedVehicles, function(item) {
  return item.makeCode;
});
这将返回一个对象,因此我们需要迭代这些键,并执行第二个
groupBy

_.forEach(selectedVehicles, function(value, key) {
  selectedVehicles[key] = _.groupBy(selectedVehicles[key], function(item) {
    return item.modelCode;
  });
});
由此,您将得到一个形式的对象。我将让您从每个数组中获取计数

{ 'Make-A': { 'Model-a': [ ... ] },
  'Make-B': { 'Model-c': [ ... ] },
  'Make-C': { 'Model-b': [ ..., ... ] } }
您可以使用,并在一个循环中执行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”,“Model-c”,“trimCode”:“trim-A”,“yearCode”:“2014”{“id”:25,“选定”: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”,“Model-g”,“trimCode”:“trim-a”,“yearCode”:“2013”{“id”:2,“selected”:true,“makeCode”:”Make-A、“型号代码”:“h型”、“trimCode”:“trim-A”、“年份代码”:“2013”}];
var结果=arr.REDUCT(功能(映射,对象){
如果(!对象已选定){
返回图;
}
var makeCode=map[obj.makeCode]=map[obj.makeCode]| |{};
var modelCode=makeCode[obj.modelCode]=makeCode[obj.modelCode]| |{count:0};
modelCode.count++;
返回图;
},Object.create(null));

console.log(result);
我不确定这是否能解决您的问题,但在group_by中,您可以添加允许您创建复合密钥的自定义逻辑

请记住,分隔符值应根据您使用的数据源定义,如果“-”字符出现在模型或类型中,则不应使用它们,因为这将不允许您反转分组过程

const SEPERATOR = "--";
_.chain(data).filter((item) => item.selected).groupBy((item)=>`${item.model}${SEPERATOR}${item.type}`).value();
const result=uu.chain(车辆)
.filter('已选择')
.groupBy('makeCode'))
.mapValues(值=>ux0.chain(值)
.groupBy('modelCode')
.mapValues(u.size)
.value()
)
.value()
constmultigroupby=(数组、组、…restGroups)=>{
如果(!组){
返回数组;
}
const currGrouping=u.groupBy(数组,组);
如果(!restGroups.length){
返回分组;
}
return.transform(currogrouping,(结果、值、键)=>{
结果[键]=multiGroupBy(值,…restGroups);
}, {});
};
log(multiGroupBy([{x:1,y:1,z:1},{x:1,y:2,z:1},{x:2,y:1,z:1},{x:2,y:2,z:1},{x:1,z:2},{x:1,y:2,z:2},{x:2,y:1,z:2},{x:2,y:2,'x','y'))

对纯JS上没有LODASH的对象或数组进行分组和筛选:

//ГПППииаааааааааааааааааааj:
设k=“HUID”,//分组依据;
输入=[
{HUID:11,test:1},
{HUID:11,test:111},
{HUID:'eeeeeeee',test:11111},
{HUID:22,test:2},
{HUID:33,test:3}
],
结果=输入。减少((映射,对象)=>{
//如果(!obj.selected){返回映射;}
设makeCode=(map[obj[k]]=map[obj[k]]| |{})//var modelCode=makeCode[obj.HUID]=makeCode[obj.HUID]|{count:0};
设l=map[obj[k]],
m=对象。键(l)。长度;
l[m]={……obj};
返回图;
}, {} );

console.log(result);
您不需要重复所有数组对象。使用loadash,您可以简化如下操作:

_.mapValues(_.groupBy(object, 'yourKeys'))

如果您关注结果,则以下代码有效:

在我的例子中,
Brand
itemcode
是属性

const products=uu.groupBy(this.productsTable.data,(item)=>{
退货[商品['Brand'],商品['item Code'];
});

如果X型车和Y型车有一个Make-T,这样做很有意义!我想得太多了。你可以使用
属性
速记,只需执行
.groupBy(selectedVehicles,'makeCode')
此方法更有效,因为我们只在项目中循环一次。Genius!只需在之后添加
.value()
。这是一个好主意。注意小边大小写。假设“-”是一个有效字符。此对象
{model:'-',type:'-}
和此对象
{model:'-',type:'}
将被分组,尽管它们没有相同的模型和类型hi@yonBav您这里有一点,即应该使用常量变量来保留分隔符值,这对于反向分组过程或从字典键访问模型或类型信息也很重要。但是@yonBav我不同意您的示例,不是吗分隔符的值必须根据您处理的数据来选择。示例代码片段只是说明如何解决问题。未考虑数据上下文。此语句的作用是什么?
var makeCode=map[obj.makeCode]=map[obj.makeCode]|{};
var makeCode=map中我年轻人的主要思想[obj.makeCode]=map[obj.makeCode]|{};
is-分配
map[obj.makeCode]
或和空对象
{}
map[obj.makeCode]
(它在
map[obj.makeCode]
还不存在的情况下用作回退),并分配
map[obj.makeCode]
makeCode
。我必须承认,它不是世界上可读性最好的代码。我会的
{ 'Make-A': { 'Model-a': [ ... ] },
  'Make-B': { 'Model-c': [ ... ] },
  'Make-C': { 'Model-b': [ ..., ... ] } }
const SEPERATOR = "--";
_.chain(data).filter((item) => item.selected).groupBy((item)=>`${item.model}${SEPERATOR}${item.type}`).value();
_.mapValues(_.groupBy(object, 'yourKeys'))