Object lodash链接分组
我试图找出如何将仅按修剪/年份唯一的车辆对象数组转换为嵌套对象属性的数组。最初,我循环遍历所有属性,以将车辆组织成数组的层次结构,即make[model[trim[year[]]]],但我认为按对象属性(即make.model.trim.year)查找车辆会更快。我是个酒鬼,所以我不知道该怎么办 返回的数据的结构如下所示:Object lodash链接分组,object,grouping,lodash,Object,Grouping,Lodash,我试图找出如何将仅按修剪/年份唯一的车辆对象数组转换为嵌套对象属性的数组。最初,我循环遍历所有属性,以将车辆组织成数组的层次结构,即make[model[trim[year[]]]],但我认为按对象属性(即make.model.trim.year)查找车辆会更快。我是个酒鬼,所以我不知道该怎么办 返回的数据的结构如下所示: [ { id:1 makeCode:"Make1" modelCode:"Modela" selected:true trimCo
[
{
id:1
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"D"
yearCode:"2014"
},
{
id:2
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"D"
yearCode:"2015"
},
{
id:3
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"D"
yearCode:"2016"
},
{
id:4
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"LX"
yearCode:"2014"
},
{
id:5
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"LX"
yearCode:"2015"
},
{
id:6
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"LX"
yearCode:"2016"
},
{
id:7
makeCode:"Make2"
modelCode:"Modelb"
selected:true
trimCode:"D"
yearCode:"2014"
},
{
id:8
makeCode:"Make2"
modelCode:"Modelb"
selected:true
trimCode:"D"
yearCode:"2015"
},
{
id:9
makeCode:"Make2"
modelCode:"Modelb"
selected:true
trimCode:"D"
yearCode:"2016"
}
]
{
Make1: {
modela: {
D: {
'2012': false,
'2013': false
'2014': true // selected
}
}
}
}
}
这可以正确地获得由makeCode排序的对象:
vm.makeGroups = _.groupBy(vm.selectedVehcileTypes, function(v) { return v.makeCode});
但我想在每个层面上都这样做,所以我有一些类似的东西:
vm.makeGroups = _.groupBy(vm.selectedVehcileTypes, function(v) { return v.makeCode});
vm.modelGroups = _.groupBy(vm.makeGroups, function(v) { return v.modelCode});
vm.trimGroups = _.groupBy(vm.modelGroups, function(v) { return v.trimCode});
基本上,我希望链接分组,以便最终结果如下所示:
[
{
id:1
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"D"
yearCode:"2014"
},
{
id:2
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"D"
yearCode:"2015"
},
{
id:3
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"D"
yearCode:"2016"
},
{
id:4
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"LX"
yearCode:"2014"
},
{
id:5
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"LX"
yearCode:"2015"
},
{
id:6
makeCode:"Make1"
modelCode:"Modela"
selected:true
trimCode:"LX"
yearCode:"2016"
},
{
id:7
makeCode:"Make2"
modelCode:"Modelb"
selected:true
trimCode:"D"
yearCode:"2014"
},
{
id:8
makeCode:"Make2"
modelCode:"Modelb"
selected:true
trimCode:"D"
yearCode:"2015"
},
{
id:9
makeCode:"Make2"
modelCode:"Modelb"
selected:true
trimCode:"D"
yearCode:"2016"
}
]
{
Make1: {
modela: {
D: {
'2012': false,
'2013': false
'2014': true // selected
}
}
}
}
}
非常感谢您的帮助。下面的解决方案使用
.reduce()
和.setWith()
的组合作为主要函数来获得最终结果
// array: Collection of objects
// keysPath: The path of the of the
// property to set check _.setWith docs
// keyValue: The value of each property
function getResult(array, keysPath, keyValue) {
// This is used to get the values from the keysPath
var getValue = _.curry(_.get, 2);
return _.reduce(array, function(result, item) {
// get path
var path = _.map(keysPath, getValue(item));
// set property values, note that using `Object` as a customizer
// makes sure that yearCode is not treated as an index of an array
// but an index of an object
return _.setWith(result, path, item[keyValue], Object);
}, {});
}
var result = getResult(
data,
['makeCode', 'modelCode', 'trimCode', 'yearCode'],
'selected'
);
var数据=[
{
id:1,
makeCode:“Make1”,
模型代码:“模型A”,
选择:正确,
代码:“D”,
年度代码:“2014”
},
{
id:2,
makeCode:“Make1”,
模型代码:“模型A”,
选择:正确,
代码:“D”,
年度代码:“2015”
},
{
id:3,
makeCode:“Make1”,
模型代码:“模型A”,
选择:正确,
代码:“D”,
年度代码:“2016”
},
{
id:4,
makeCode:“Make1”,
模型代码:“模型A”,
选择:正确,
trimCode:“LX”,
年度代码:“2014”
},
{
id:5,
makeCode:“Make1”,
模型代码:“模型A”,
选择:正确,
trimCode:“LX”,
年度代码:“2015”
},
{
id:6,
makeCode:“Make1”,
模型代码:“模型A”,
选择:正确,
trimCode:“LX”,
年度代码:“2016”
},
{
id:7,
makeCode:“Make2”,
模型代码:“模型B”,
选择:正确,
代码:“D”,
年度代码:“2014”
},
{
id:8,
makeCode:“Make2”,
模型代码:“模型B”,
选择:正确,
代码:“D”,
年度代码:“2015”
},
{
id:9,
makeCode:“Make2”,
模型代码:“模型B”,
选择:正确,
代码:“D”,
年度代码:“2016”
}
];
函数getResult(数组、键路径、键值){
var getValue=u0.curry(0.get,2);
返回u.reduce(数组、函数(结果、项){
var path=u2;.map(keysPath,getValue(item));
返回u.setWith(结果、路径、项[keyValue],对象);
}, {});
}
var result=getResult(
数据,
['makeCode','modelCode','trimCode','yearCode'],
“选定”
);
document.write(“”+JSON.stringify(结果,0,4)+“”)代码>
哇,谢谢你的回复。我还在想办法解决这个问题。我试着运行代码,得到的结果是“\u0.setWith不是一个函数”。我使用的是lodash版本14.4.1,有什么想法吗?您确定您使用的\u
变量是lodash而不是undescore吗?版本是4.14.1
?请重新检查。是的,我没有使用下划线并验证我的lodash版本-“lodash”:“4.14.1.如果我将其更改为u2;.set,它似乎可以工作?它不应该工作,请尝试添加您提到的代码,使用2;.set()
在这个问题中,我将尝试检查它为何会出现这种情况。我有一段时间没有这样做,但结果发现我正在使用的另一个库pdfMake包含它自己的lodash 3.10.1版自定义版本。通过更改导入顺序似乎可以修复。再次感谢,伙计!