首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构Lodash码

重构Lodash码
EN

Stack Overflow用户
提问于 2016-07-09 19:46:07
回答 4查看 305关注 0票数 1

我有以下数据结构:

代码语言:javascript
复制
var machines = [
                {"endUser": "Multi Corp", "Location": "Germany", "MachineName": "Machine1"},
                {"endUser": "Multi Corp", "Location": "Germany", "MachineName": "Teeth"},
                {"endUser": "Multi Corp", "Location": "Germany", "MachineName": "Aaaabcc"},
                {"endUser": "Multi Corp", "Location": "France", "MachineName": "FAST"},
                {"endUser": "Multi Corp", "Location": "France", "MachineName": "Slow"},
                {"endUser": "Test", "Location": "Germany", "MachineName": "Swess"},
                {"endUser": "Test", "Location": "Germany", "MachineName": "aswees"},
                {"endUser": "Test", "Location": "France", "MachineName": "Abcd"},
                {"endUser": "Test", "Location": "France", "MachineName": "Efghhh"}
            ];

现在我要做的是:

  1. endUser按asc顺序分组数据
  2. 按asc顺序按位置分列数据中的每个分组行组
  3. 按asc顺序按MachineName排序

因此,输出应该如下所示:

我编写了这样的代码,但我刚刚开始使用Lodash,我确信我的代码可以被重构成更简单的形式,因为现在我甚至想因为它而自杀,但是由于缺乏房客经验,我不知道如何改进它。

代码:

代码语言:javascript
复制
var machines = [
                {"endUser": "Multi Corp", "Location": "Germany", "MachineName": "Machine1"},
                {"endUser": "Multi Corp", "Location": "Germany", "MachineName": "Teeth"},
                {"endUser": "Multi Corp", "Location": "Germany", "MachineName": "Aaaabcc"},
                {"endUser": "Multi Corp", "Location": "France", "MachineName": "FAST"},
                {"endUser": "Multi Corp", "Location": "France", "MachineName": "Slow"},
                {"endUser": "Test", "Location": "Germany", "MachineName": "Swess"},
                {"endUser": "Test", "Location": "Germany", "MachineName": "aswees"},
                {"endUser": "Test", "Location": "France", "MachineName": "Abcd"},
                {"endUser": "Test", "Location": "France", "MachineName": "Efghhh"}
            ];
            var machinesByEndUser = _.chain(machines)
                                    .sortBy(function(machine) { return machine.endUser.toLocaleLowerCase() })
                                    .groupBy(function(machine) { return machine.endUser})
                                    .value();
            var machinesFinal = {};
            _.forOwn(machinesByEndUser, function(value, key){ 
                var machinesByLocationPerUser = _.chain(value)
                                    .sortBy(function(machine) { return machine.Location.toLocaleLowerCase() })
                                    .groupBy(function(machine) { return machine.Location})
                                    .value();
                var orderMachines = [];
                _.forOwn(machinesByLocationPerUser, function(value, key){ 
                    var sortedMachines = _.sortBy(value, function(machine) {return machine.MachineName.toLocaleLowerCase()});
                    orderMachines.push(sortedMachines);
                });
                var flatten = _.flatten(orderMachines);
                var orderedMachinesByLocation = _.groupBy(flatten, function(singleMach) {return singleMach.Location});
                machinesByEndUser[key] = orderedMachinesByLocation;                    
            } );
            console.log(machinesByEndUser);  

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-10 07:54:04

您可以执行以下操作:

  1. 使用orderBy()按升序顺序对endUserLocation的集合进行排序。
  2. 使用groupBy()endUser对集合进行分组。
  3. mapValues()groupBy()将每组endUserLocation分组。
代码语言:javascript
复制
var result = _(machines)
  .orderBy(['endUser', 'Location'])
  .groupBy('endUser')
  .mapValues(_.partial(_.groupBy, _, 'Location'))
  .value();

代码语言:javascript
复制
var machines = [{
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Machine1"
}, {
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Teeth"
}, {
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Aaaabcc"
}, {
  "endUser": "Multi Corp",
  "Location": "France",
  "MachineName": "FAST"
}, {
  "endUser": "Multi Corp",
  "Location": "France",
  "MachineName": "Slow"
}, {
  "endUser": "Test",
  "Location": "Germany",
  "MachineName": "Swess"
}, {
  "endUser": "Test",
  "Location": "Germany",
  "MachineName": "aswees"
}, {
  "endUser": "Test",
  "Location": "France",
  "MachineName": "Abcd"
}, {
  "endUser": "Test",
  "Location": "France",
  "MachineName": "Efghhh"
}];

var result = _(machines)
  .orderBy(['endUser', 'Location'])
  .groupBy('endUser')
  .mapValues(_.partial(_.groupBy, _, 'Location'))
  .value();

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
代码语言:javascript
复制
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

下面是上述提交解决方案的lodash版本:

代码语言:javascript
复制
var result = compose(
  mapValues(groupBy('Location')),
  groupBy('endUser'),
  orderBy(['endUser', 'Location'], ['asc', 'asc'])
)(machines);

代码语言:javascript
复制
var machines = [{
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Machine1"
}, {
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Teeth"
}, {
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Aaaabcc"
}, {
  "endUser": "Multi Corp",
  "Location": "France",
  "MachineName": "FAST"
}, {
  "endUser": "Multi Corp",
  "Location": "France",
  "MachineName": "Slow"
}, {
  "endUser": "Test",
  "Location": "Germany",
  "MachineName": "Swess"
}, {
  "endUser": "Test",
  "Location": "Germany",
  "MachineName": "aswees"
}, {
  "endUser": "Test",
  "Location": "France",
  "MachineName": "Abcd"
}, {
  "endUser": "Test",
  "Location": "France",
  "MachineName": "Efghhh"
}];

var { orderBy, groupBy, mapValues, compose } = _;

var result = compose(
  mapValues(groupBy('Location')),
  groupBy('endUser'),
  orderBy(['endUser', 'Location'], ['asc', 'asc'])
)(machines);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
代码语言:javascript
复制
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.fp.min.js"></script>

如果您只是想要一个普通的JS解决方案,您可以这样做:

代码语言:javascript
复制
var result = machines
.slice() // Use slice to make sure that we don't mutate the original array
.sort(function(a, b) { // order by endUser and Location in ascending order
  return a.endUser.localeCompare(b.endUser) +
    a.Location.localeCompare(b.Location);
})
.reduce(function(group, item) {
  // group collection by endUser
  var endUserGroup = group[item.endUser] = group[item.endUser] || {};
  // group endUser group by Location
  var locationGroup = endUserGroup[item.Location] = endUserGroup[item.Location] || [];
  locationGroup.push(item);
  return group;
}, {});

代码语言:javascript
复制
var machines = [{
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Machine1"
}, {
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Teeth"
}, {
  "endUser": "Multi Corp",
  "Location": "Germany",
  "MachineName": "Aaaabcc"
}, {
  "endUser": "Multi Corp",
  "Location": "France",
  "MachineName": "FAST"
}, {
  "endUser": "Multi Corp",
  "Location": "France",
  "MachineName": "Slow"
}, {
  "endUser": "Test",
  "Location": "Germany",
  "MachineName": "Swess"
}, {
  "endUser": "Test",
  "Location": "Germany",
  "MachineName": "aswees"
}, {
  "endUser": "Test",
  "Location": "France",
  "MachineName": "Abcd"
}, {
  "endUser": "Test",
  "Location": "France",
  "MachineName": "Efghhh"
}];

var result = machines
.slice() // Use slice to make sure that we don't mutate the original array
.sort(function(a, b) { // order by endUser and Location in ascending order
  return a.endUser.localeCompare(b.endUser) +
    a.Location.localeCompare(b.Location);
})
.reduce(function(group, item) {
  // group collection by endUser
  var endUserGroup = group[item.endUser] = group[item.endUser] || {};
  // group endUser group by Location
  var locationGroup = endUserGroup[item.Location] = endUserGroup[item.Location] || [];
  locationGroup.push(item);
  return group;
}, {});

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
代码语言:javascript
复制
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.fp.min.js"></script>

票数 1
EN

Stack Overflow用户

发布于 2016-07-09 20:45:46

试试这个:

代码语言:javascript
复制
var result = _(machines)
  .groupBy(machine => machine.endUser.toLowerCase())
  .mapValues(machines => (
    _(machines)
      .groupBy(machine => machine.Location.toLowerCase())
      .mapValues(machines => (
        _(machines)
          .map('MachineName')
          .sort()
          .value()
      ))
      .value()
  ))
  .value()

小提琴:https://jsfiddle.net/c38thoqn/

正如其他人正确指出的那样,从定义上看,不能真正对对象进行排序;对象的排序是未定义的。某些JavaScript实现碰巧有对象排序,但这是不标准的。

票数 2
EN

Stack Overflow用户

发布于 2016-07-09 20:21:25

这里有两个forEach循环的纯Javascript方法

代码语言:javascript
复制
var machines = [{"endUser":"Multi Corp","Location":"Germany","MachineName":"Machine1"},{"endUser":"Multi Corp","Location":"Germany","MachineName":"Teeth"},{"endUser":"Multi Corp","Location":"Germany","MachineName":"Aaaabcc"},{"endUser":"Multi Corp","Location":"France","MachineName":"FAST"},{"endUser":"Multi Corp","Location":"France","MachineName":"Slow"},{"endUser":"Test","Location":"Germany","MachineName":"Swess"},{"endUser":"Test","Location":"Germany","MachineName":"aswees"},{"endUser":"Test","Location":"France","MachineName":"Abcd"},{"endUser":"Test","Location":"France","MachineName":"Efghhh"}];
            
var result = {};
machines.forEach(function(e) {
 result[e.endUser] = {}
})

machines.forEach(function(e) {
  result[e.endUser][e.Location] = (result[e.endUser][e.Location] || []).concat(e).sort(function(a, b) {
    return a.MachineName.localeCompare(b.MachineName);
  });
});

document.body.innerHTML = '<pre>' + JSON.stringify(result, 0, 4) + '</pre>';

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

https://stackoverflow.com/questions/38285728

复制
相关文章

相似问题

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