Object lodash链接分组

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

我试图找出如何将仅按修剪/年份唯一的车辆对象数组转换为嵌套对象属性的数组。最初,我循环遍历所有属性,以将车辆组织成数组的层次结构,即make[model[trim[year[]]]],但我认为按对象属性(即make.model.trim.year)查找车辆会更快。我是个酒鬼,所以我不知道该怎么办

返回的数据的结构如下所示:

[
  {
    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版自定义版本。通过更改导入顺序似乎可以修复。再次感谢,伙计!