通过多个属性下划线对数组中的元素进行分组
Grouping elements in array by multiple properties underscore
工作期间,我接到了这样的任务:对数组中具有相似属性的元素进行分组。
一般来说,问题如下:
var order = [
{
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Discharge pressure"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"RCU",
"equipment":"37 P 552 B",
"parameter":"Discharge pressure"
}
]
如果我按 'ru'、'area'、'unit'、'tot'、'equipment' 和 'parameter' 对这些元素进行分组,我将得到这个结果:
var result = [
{
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"tot":2,
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"tot":1,
"equipment":"37 P 552 A",
"parameter":"Discharge Pressure"
}, {
"ru":"R401",
"area":"RFCC",
"unit":"RCU",
"tot":1,
"equipment":"37 P 552 B",
"parameter":"Discharge Pressure"
}];
经过一些实验,我得出以下代码:
var groups = _.groupBy(order, function(value) {
return value.ru + "#" + value.area + "#" + value.unit + "#" + value.equipment + "#" + value.parameter + "#";
});
groups = _.map(groups, function(group) {
return _.extend(group[0], {tot: group.length});
});
现在我遇到了如何对相似的结果元素进行分组的问题。如果这附近有人,请帮助我。提前致谢。
这个怎么样:
var order = [
{
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Discharge pressure"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"RCU",
"equipment":"37 P 552 B",
"parameter":"Discharge pressure"
}
];
var result = [];
order.forEach(current=>{
let index = -1;
result.forEach((c,i)=>{
if (c.ru==current.ru && c.area==current.area && c.unit==current.unit && c.tot==current.tot && c.equipment==current.equipment && c.parameter==current.parameter){
index = i;
}
});
// console.log(index);
if(index==-1){
result.push(current);
}else{
result[index]["tot"] = result[index]["tot"]+current["tot"];
}
});
console.log(result);
也许你可以避免分组,直接更新你"index"map/object中合并对象的tot
属性,如果你遇到类似的元素:
这是一个使用 reduce
实现的解决方案:
const order = [
{
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Discharge pressure"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"RCU",
"equipment":"37 P 552 B",
"parameter":"Discharge pressure"
}
]
const merged = Object.values(order.reduce((acc, curr) => {
const key = `${curr.ru}#${curr.area}#${curr.unit}#${curr.equipment}#${curr.parameter}`;
if (key in acc) acc[key].tot += 1;
else acc[key] = Object.assign({}, curr);
return acc;
}, {}));
console.log(merged);
console.log(merged.map(d => d.ru));
工作期间,我接到了这样的任务:对数组中具有相似属性的元素进行分组。
一般来说,问题如下:
var order = [
{
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Discharge pressure"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"RCU",
"equipment":"37 P 552 B",
"parameter":"Discharge pressure"
}
]
如果我按 'ru'、'area'、'unit'、'tot'、'equipment' 和 'parameter' 对这些元素进行分组,我将得到这个结果:
var result = [
{
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"tot":2,
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"tot":1,
"equipment":"37 P 552 A",
"parameter":"Discharge Pressure"
}, {
"ru":"R401",
"area":"RFCC",
"unit":"RCU",
"tot":1,
"equipment":"37 P 552 B",
"parameter":"Discharge Pressure"
}];
经过一些实验,我得出以下代码:
var groups = _.groupBy(order, function(value) {
return value.ru + "#" + value.area + "#" + value.unit + "#" + value.equipment + "#" + value.parameter + "#";
});
groups = _.map(groups, function(group) {
return _.extend(group[0], {tot: group.length});
});
现在我遇到了如何对相似的结果元素进行分组的问题。如果这附近有人,请帮助我。提前致谢。
这个怎么样:
var order = [
{
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Discharge pressure"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"RCU",
"equipment":"37 P 552 B",
"parameter":"Discharge pressure"
}
];
var result = [];
order.forEach(current=>{
let index = -1;
result.forEach((c,i)=>{
if (c.ru==current.ru && c.area==current.area && c.unit==current.unit && c.tot==current.tot && c.equipment==current.equipment && c.parameter==current.parameter){
index = i;
}
});
// console.log(index);
if(index==-1){
result.push(current);
}else{
result[index]["tot"] = result[index]["tot"]+current["tot"];
}
});
console.log(result);
也许你可以避免分组,直接更新你"index"map/object中合并对象的tot
属性,如果你遇到类似的元素:
这是一个使用 reduce
实现的解决方案:
const order = [
{
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Discharge pressure"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"OFFSITE",
"equipment":"37 P 552 A",
"parameter":"Speed"
}, {
"tot":1,
"ru":"R401",
"area":"RFCC",
"unit":"RCU",
"equipment":"37 P 552 B",
"parameter":"Discharge pressure"
}
]
const merged = Object.values(order.reduce((acc, curr) => {
const key = `${curr.ru}#${curr.area}#${curr.unit}#${curr.equipment}#${curr.parameter}`;
if (key in acc) acc[key].tot += 1;
else acc[key] = Object.assign({}, curr);
return acc;
}, {}));
console.log(merged);
console.log(merged.map(d => d.ru));