javascript - 如何对具有多个值的对象数组进行分组?

标签 javascript arrays

我想对我使用两个值office和reportName完成的对象数组进行分组,但我希望将电子邮件ID放在我收到的字符串中,但电子邮件ID不是唯一的。我必须尝试添加所有电子邮件但是当我尝试连接时它给出一个空字符串。谁能知道如何做到这一点

var data = [{
    email: 'amar045@gmail.com',
    office: 'xyz.in',
    reportName: 'payroll',
  },
  {
    email: 'amar0455@gmail.com',
    office: 'xyz.in',
    reportName: 'payroll',
  },
  {
    email: 'amar0455@gmail.com',
    office: 'xyz.in',
    reportName: 'payroll',
  },
  {
    email: 'amar045@gmail.com',
    office: 'xyz.in',
    reportName: 'payroll',
  },
  {
    email: 'amar0445@gmail.com',
    office: 'yyy.in',
    reportName: 'delievered',
  },
  {
    email: 'amar0445@gmail.com',
    office: 'yyy.in',
    reportName: 'delievered',
  },
  {
    email: 'amar0425@gmail.com',
    office: 'yyy.in',
    reportName: 'payroll',
  },

  {
    email: 'amar0425@gmail.com',
    office: 'xyz.in',
    reportName: 'delievered',
  }
];

let hash = Object.create(null);
let grouped = [];

data.forEach(function(o) {
  var key = ['office', 'reportName']
    .map(function(k) {
      return o[k];
    })
    .join('|');

  if (!hash[key]) {
    hash[key] = {
      office: o.office,
      reportName: o.reportName,
      email: ''
    };
    grouped.push(hash[key]);
  }
  ['email'].forEach(function(k) {
    hash[key][k] += o[k].split(',');
  });
});
console.log(grouped);

预期输出为

[
  {
    office: 'xyz.in',
    reportName: 'payroll',
     email: 'amar045@gmail.com, amar0455@gmail.com, amar0425@gmail.com'
  },
  {
    office: 'yyy.in',
    reportName: 'delievered',
    email: 'amar0445@gmail.com, amar0425@gmail.com'
  },
  {
    office: 'yyy.in',
    reportName: 'payroll',
    email: 'amar0425@gmail.com'
  }
]

最佳答案

您可以使用 String 的“includes”方法来检查电子邮件是否已存在并更新对象的电子邮件属性。

var data = [
  {
    email: 'amar045@gmail.com',
    office: 'xyz.in',
    reportName: 'payroll',
  },
  {
    email: 'amar0455@gmail.com',
    office: 'xyz.in',
    reportName: 'payroll',
  },
  {
    email: 'amar0455@gmail.com',
    office: 'xyz.in',
    reportName: 'payroll',
  },
  {
    email: 'amar045@gmail.com',
    office: 'xyz.in',
    reportName: 'payroll',
  },
  {
    email: 'amar0445@gmail.com',
    office: 'yyy.in',
    reportName: 'delievered',
  },
  {
    email: 'amar0445@gmail.com',
    office: 'yyy.in',
    reportName: 'delievered',
  },
  {
    email: 'amar0425@gmail.com',
    office: 'yyy.in',
    reportName: 'payroll',
  },

  {
    email: 'amar0425@gmail.com',
    office: 'xyz.in',
    reportName: 'delievered',
  }
];

let hash = Object.create(null);
let grouped = [];

data.forEach(function(o) {
  var key = ['office', 'reportName']
    .map(function(k) {
      return o[k];
    })
    .join('|');

  if (!hash[key]) {
    hash[key] = {office: o.office, reportName: o.reportName, email: ''};
    grouped.push(hash[key]);
  }
  ['email'].forEach(function(k) {
    if (hash[key] && !hash[key][k].includes(o[k])){
        hash[key][k] += o[k] + ',';
      }
    });
});
console.log(grouped);

关于javascript - 如何对具有多个值的对象数组进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59660090/

相关文章:

javascript - 如何减慢代码速度?

javascript - 警报检测正常

javascript - 使用 Web Audio API 使用 OscillatorNodes 演奏和弦

java - 使用 Arrays.sort() 对具有自定义行数和列数的二维数组进行排序

javascript - 将 nextSibling 转换为输入

javascript - 卡在 else if 循环中

javascript - 是否可以通过解构从数组创建对象?

c++ - `constexpr` `std::array` 的二元运算

PHP:对象数组 - 序列化与 json_encode - 替代方案?

javascript - 一些我不明白的 JavaScript 语法