首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组中的元素按多个属性下划线分组

将数组中的元素按多个属性下划线分组
EN

Stack Overflow用户
提问于 2018-11-09 03:53:48
回答 2查看 71关注 0票数 0

在工作期间,我被赋予这样的任务:对数组中具有类似属性的元素进行分组。

一般来说,问题如下:

代码语言:javascript
复制
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”、“面积”、“单位”、“tot”、“设备”和“参数”对这些元素进行分组,我将得到以下结果:

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

在进行了一些实验之后,我得出了以下代码:

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

现在,我有一个问题,如何分组相似的结果元素。如果附近有人,请帮帮我。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-09 04:29:05

这个怎么样:

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

票数 0
EN

Stack Overflow用户

发布于 2018-11-09 04:41:25

如果遇到类似的元素,也许可以避免分组,并直接更新“索引”映射/对象中合并对象的tot属性:

下面是用reduce实现这一目的的解决方案

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

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

https://stackoverflow.com/questions/53219628

复制
相关文章

相似问题

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