Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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_Typescript_Reduce - Fatal编程技术网

Javascript 试图将一个对象数组减少为一个相似但汇总的对象数组

Javascript 试图将一个对象数组减少为一个相似但汇总的对象数组,javascript,typescript,reduce,Javascript,Typescript,Reduce,所以我有一个对象数组,看起来像: dataArray = [ {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"}, {Revenue: 10, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"}, {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"}, {

所以我有一个对象数组,看起来像:

dataArray = [
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 10, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 1, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"},
    {Revenue: 4, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"}
]
我需要的是将其简化为另一个对象数组,看起来像:

reducedDataArray = [
    {Revenue: 20, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 5, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"}
]
基本上,如果日期相同,则需要对收入进行汇总,以便不存在同一日期的多个实例。不幸的是,我仅限于我们的Typescript版本,所以我没有所有的ES6好东西来帮助我处理这些东西。我尝试过使用诸如reduce之类的工具,但我认为,我不知道自己在做什么,这种奇怪的组合让我陷入了迷雾

如有任何建议或见解,将不胜感激

可以使用reduce创建带有日期键的对象,然后将该对象转换回数组

let dataArray = [
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 10, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 1, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"},
    {Revenue: 4, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"}
]
// We need to specify the type parameter explicitly, as it will not be inffered from initial value 
let valuesObj = dataArray.reduce<{ [date: string]: typeof dataArray[number] }>((p, v) => {
    const existing = p[v.Date];
    if (existing) {
        existing.Revenue += v.Revenue
    } else {
        p[v.Date] = Object.assign({}, v); //Create a copy so as to not change the original when we sum 
    }
    return p;
}, {});


// You can use Object.values(valuesObj) if available 
let values = Object.keys(valuesObj).map(k => valuesaObj[k]);
操场

您可以使用reduce创建带有日期键的对象,然后将该对象转换回数组

let dataArray = [
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 10, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 1, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"},
    {Revenue: 4, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"}
]
// We need to specify the type parameter explicitly, as it will not be inffered from initial value 
let valuesObj = dataArray.reduce<{ [date: string]: typeof dataArray[number] }>((p, v) => {
    const existing = p[v.Date];
    if (existing) {
        existing.Revenue += v.Revenue
    } else {
        p[v.Date] = Object.assign({}, v); //Create a copy so as to not change the original when we sum 
    }
    return p;
}, {});


// You can use Object.values(valuesObj) if available 
let values = Object.keys(valuesObj).map(k => valuesaObj[k]);

操场

玩了一些圈圈,效果很好

dataArray = [
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 10, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 1, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"},
    {Revenue: 4, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"}
];

const getUnique=array=>{
  return array.filter((value, index, self)=> { 
      return self.indexOf(value) === index;
  });
}

let date=[];
let output=[];

for(const v of dataArray) date.push(v.Date);
for(const v of getUnique(date)){

  let revenue=0,date=v,dateString;
  for(const x of dataArray){
    if(x.Date==v) revenue+=x.Revenue;
    dateString=x.DateString;
  }

  output.push({
    Revenue:revenue,
    Date:v,
    DateString:dateString
  });

}

console.log(output);

玩了一些循环,它的工作

dataArray = [
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 10, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 5, Date: "2018-06-05T00:00:00", DateString: "6/5/2018"},
    {Revenue: 1, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"},
    {Revenue: 4, Date: "2018-06-13T00:00:00", DateString: "6/13/2018"}
];

const getUnique=array=>{
  return array.filter((value, index, self)=> { 
      return self.indexOf(value) === index;
  });
}

let date=[];
let output=[];

for(const v of dataArray) date.push(v.Date);
for(const v of getUnique(date)){

  let revenue=0,date=v,dateString;
  for(const x of dataArray){
    if(x.Date==v) revenue+=x.Revenue;
    dateString=x.DateString;
  }

  output.push({
    Revenue:revenue,
    Date:v,
    DateString:dateString
  });

}

console.log(output);

将您尝试过的代码添加到您的问题中。您不需要任何花哨的东西来循环,将按键日期的总计添加到空白对象中,然后将其转换回数组,从日期派生出日期字符串;ES3已经足够了…将您尝试过的代码添加到您的问题中。您不需要任何花哨的东西来循环并将按键日期的总计添加到空白对象,然后可以将其转换回数组,从日期派生出日期字符串;ES3已经足够了…@prail和我的手机:-p非常感谢你抽出时间写下这篇文章。我真的很感激。@prail和我的手机:-p非常感谢你抽出时间写下这篇文章。我真的很感激。非常感谢!我将此标记为答案,因为它遵循与我正在使用的其他代码类似的模式。非常感谢!我将此标记为答案,因为它遵循与我正在使用的其他代码类似的模式。