首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lodash链接groupBy

lodash链接groupBy
EN

Stack Overflow用户
提问于 2016-08-06 06:24:35
回答 1查看 2.2K关注 0票数 2

我正在尝试弄清楚如何将vehicle对象的数组转换为数组嵌套对象属性。最初,我循环遍历所有属性以将车辆组织到一个分层结构的数组中,即make[Model[Trim[year[],但我认为通过对象属性(即make.model.trim.year )查找车辆会更快。我是个新手,所以我不知道该怎么做。

返回的数据结构如下:

代码语言:javascript
复制
[
  {
    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"
  }
]

这可以正确地获得按makeCode排序的对象:

代码语言:javascript
复制
vm.makeGroups = _.groupBy(vm.selectedVehcileTypes, function(v) { return v.makeCode});

但我想在每个层次上都这样做,所以我有一些类似的东西:

代码语言:javascript
复制
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});

基本上,我希望链接分组,使最终结果如下所示:

代码语言:javascript
复制
{
  Make1: {
    modela: {
      D: {
           '2012': false,
           '2013': false 
           '2014': true // selected
         } 
       }
     }
   }
}

感谢您的帮助,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-06 11:15:00

下面的解决方案使用_.reduce()_.setWith()的组合作为主要函数来获得最终结果。

代码语言:javascript
复制
// 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'
);

代码语言:javascript
复制
var data = [
  {
    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"
  }
];

function getResult(array, keysPath, keyValue) {
  var getValue = _.curry(_.get, 2);
  return _.reduce(array, function(result, item) {
    var path = _.map(keysPath, getValue(item));
    return _.setWith(result, path, item[keyValue], Object);
  }, {});
}

var result = getResult(
  data,
  ['makeCode', 'modelCode', 'trimCode', 'yearCode'],
  'selected'
);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.1/lodash.js"></script>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38798523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档