首页 > 解决方案 > 通过多个属性下划线对数组中的元素进行分组

问题描述

在工作中,我被赋予了这个任务:将数组中具有相似属性的元素分组。

一般来说,问题如下:

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});
  });

现在我有问题如何对相似的结果元素进行分组。如果有人在这附近,请帮助我。提前致谢。

标签: javascriptarraysjsonunderscore.js

解决方案


这个怎么样:

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);


推荐阅读