javascript - 将多个对象数组转换为单个数组,同时合并公共(public)键上的对象

标签 javascript arrays object

所以我有一个看起来像这样的对象数组。

const myArray = [
  {
    values: [
      { date: "2018-11-02", "value1": 3, "value2": 5 },
      { date: "2018-11-01", "value1": 8, "value2": 9 },
      { date: "2018-10-31", "value1": 4, "value2": 10 },
    ],
    customer: "Customer One"
  },
  {
    values: [
      { date: "2018-11-02", "value1": 3 },
      { date: "2018-11-01", "value1": 5 },
      { date: "2018-10-31", "value1": 8 },
    ],
    customer: "Customer Two"
  }
];

一个对象的所有值应该(按日期)求和,然后作为新对象中客户的值

我想要的是它看起来像这样:

result = [
  { date: "2018-11-02", "Customer One": 8, "Customer Two": 3 },
  { date: "2018-11-01", "Customer One": 17, "Customer Two": 5 },
  { date: "2018-10-31", "Customer One": 14, "Customer Two": 8 },
]

我有这方面的工作代码,但感觉对于我需要的东西来说太复杂了,但出于某种原因我无法想出更简单的方法。

这是我的代码(也在 codesandbox 上:https://codesandbox.io/s/zvlpm167x):

const myArray = [
  {
    values: [
      { date: "2018-11-02", "value1": 3, "value2": 5 },
      { date: "2018-11-01", "value1": 8, "value2": 9 },
      { date: "2018-10-31", "value1": 4, "value2": 10 },
    ],
    customer: "Customer One"
  },
  {
    values: [
      { date: "2018-11-02", "value1": 3 },
      { date: "2018-11-01", "value1": 5 },
      { date: "2018-10-31", "value1": 8 },
    ],
    customer: "Customer Two"
  }
];

const flatArray = myArray.flat();

const sumObjectKeysExceptDate = object => Object.keys(object).reduce((sum, key) => {
  if (!Number.isNaN(parseInt(object[key], 10)) && key !== 'date') {
    return sum + parseInt(object[key], 10);
  }
  return sum;
}, 0);

const result = flatArray
  .reduce((acc, row) => [...acc, ...row.values.map(value => ({ [row.customer]: sumObjectKeysExceptDate(value), date: value.date }))], [])
  .reduce((acc, row) => {
    if (acc.find(innerrow => innerrow.date === row.date)) {
      return acc.map((innerrow) => {
        if (innerrow.date === row.date) {
          return { ...innerrow, ...row };
        }
        return innerrow;
      });
    }
    return [...acc, row];
  }, []);

console.log(result)

最佳答案

尝试跟随

  • 创建一个对象,以date 为键,相应的结果对象为值。并使用Object.values得到最终结果
  • 要构建对象,请在外部数组上使用 Array.reduce 并针对内部数组的每个值检查对象中是否存在日期条目。如果存在则更新它,否则在对象中创建一个新条目。
  • 对于内部数组中的每个对象,将除 date 之外的所有键的值相加,并将其设置在与 customer name 键对应的对象中。

const myArray = [{values: [{ date: "2018-11-02", "value1": 3, "value2": 5 },{ date: "2018-11-01", "value1": 8, "value2": 9 },{ date: "2018-10-31", "value1": 4, "value2": 10 },],customer: "Customer One"},{values: [{ date: "2018-11-02", "value1": 3 },{ date: "2018-11-01", "value1": 5 },{ date: "2018-10-31", "value1": 8 },],customer: "Customer Two"}];

let result = Object.values(myArray.reduce((a,c) => {
  c.values.forEach(({date, ...rest}) => {
    a[date] = a[date] || {date};
    a[date][c.customer] = Object.values(rest).reduce((d,e) => d + e);
  });
  return a;
}, {}));
console.log(result);

关于javascript - 将多个对象数组转换为单个数组,同时合并公共(public)键上的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53119530/

相关文章:

Java - 最高、最低和平均水平

c++ - 我们如何以恒定复杂度或 O(1) 交换 2 个数组?

c++ - 为什么在构造函数中使用 fread 时我的程序会崩溃?

javascript - 创建对象时的语法差异

javascript - videojs公共(public)方法访问就绪函数和IE之外

javascript - 使用 Jquery 隐藏动态生成的 <p>

javascript - Facebook 和 Twitter 分享按钮中的自定义 URL

javascript - 如何在 Ace Editor 中格式化 Java 代码

javascript - 在设备准备好之前运行的 jquery 移动功能

javascript - Javascript 函数中的对象