我有以下数据结构:
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"}
];现在我要做的是:
因此,输出应该如下所示:

我编写了这样的代码,但我刚刚开始使用Lodash,我确信我的代码可以被重构成更简单的形式,因为现在我甚至想因为它而自杀,但是由于缺乏房客经验,我不知道如何改进它。
代码:
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); 任何帮助都将不胜感激。
发布于 2016-07-10 07:54:04
您可以执行以下操作:
endUser和Location的集合进行排序。endUser对集合进行分组。endUser按Location分组。var result = _(machines)
.orderBy(['endUser', 'Location'])
.groupBy('endUser')
.mapValues(_.partial(_.groupBy, _, 'Location'))
.value();
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>');<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
下面是上述提交解决方案的lodash版本:
var result = compose(
mapValues(groupBy('Location')),
groupBy('endUser'),
orderBy(['endUser', 'Location'], ['asc', 'asc'])
)(machines);
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>');<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解决方案,您可以这样做:
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;
}, {});
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>');<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>
发布于 2016-07-09 20:45:46
试试这个:
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实现碰巧有对象排序,但这是不标准的。
发布于 2016-07-09 20:21:25
这里有两个forEach循环的纯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>';
https://stackoverflow.com/questions/38285728
复制相似问题