Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 合并公用键上的对象时,将多个对象数组转换为单个数组_Javascript_Arrays_Object - Fatal编程技术网

Javascript 合并公用键上的对象时,将多个对象数组转换为单个数组

Javascript 合并公用键上的对象时,将多个对象数组转换为单个数组,javascript,arrays,object,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 O

我有一个像这样的对象数组

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

试着跟随

  • 创建一个对象,将
    date
    作为键,将相应的结果对象作为值。并使用
    Object.values
    获得最终结果
  • 要构建对象,请使用
    数组。在外部数组上减少
    ,对于内部数组的每个值,检查对象中是否存在日期项。如果存在,则更新它,否则在对象中创建一个新条目
  • 对于内部数组中的每个对象,求和除date之外的所有键的值,并在与
    customer
    name键对应的对象中设置它
const myArray=[{value:[{date:“2018-11-02”,“value1:”3,“value2:”5},{date:“2018-11-01”,“value1:”8,“value2:”9},{date date:“2018-10-31”,“value1:”4,“value2:”10},],客户:“客户一号”{value:[{date date date date 2018-11-02”,“value1:”3},{date date 2018-11-01”,“value1:”5},{date 2018-10-31”,“value1:”8},客户:“客户二号”}];
让result=Object.values(myArray.reduce)(a,c)=>{
c、 values.forEach(({date,…rest})=>{
a[日期]=a[日期]|{date};
a[date][c.customer]=对象值(rest).reduce((d,e)=>d+e);
});
返回a;
}, {}));
console.log(结果);
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)