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

Javascript 合并数组并添加大量相似对象

Javascript 合并数组并添加大量相似对象,javascript,Javascript,我有一个包含日期和金额(以及其他内容)的对象数组 每个日期都有一个具有特定金额的对象,但同一日期也可以有多个包含不同金额的对象 我想合并这些对象,这样每个日期的数组中只有一个对象。。。并使该日期对应的金额为这些对象中所有先前金额的总和 以下示例可能会有所帮助: 我的阵列现在的样子: [ { date: "2019-1-1", // this is a dupe date amount: 20, ... }, {

我有一个包含日期和金额(以及其他内容)的对象数组

每个日期都有一个具有特定金额的对象,但同一日期也可以有多个包含不同金额的对象

我想合并这些对象,这样每个日期的数组中只有一个对象。。。并使该日期对应的金额为这些对象中所有先前金额的总和

以下示例可能会有所帮助:

我的阵列现在的样子:

[
    {
        date: "2019-1-1", // this is a dupe date
        amount: 20,
        ...
    },
    {
        date: "2019-1-1", // this is a dupe date
        amount: 40,
        ...
    },
    {
        date: "2019-1-2",
        amount: 40,
        ...
    },
    {
        date: "2019-1-3",
        amount: 40,
        ...
    }
]
[
    {
        date: "2019-1-1", // this is now a unique date
        amount: 60,       // and the amount was totaled
        ...
    },
    {
        date: "2019-1-2",
        amount: 40,
        ...
    },
    {
        date: "2019-1-3",
        amount: 40,
        ...
    }
]
我希望我的数组是什么样子的:

[
    {
        date: "2019-1-1", // this is a dupe date
        amount: 20,
        ...
    },
    {
        date: "2019-1-1", // this is a dupe date
        amount: 40,
        ...
    },
    {
        date: "2019-1-2",
        amount: 40,
        ...
    },
    {
        date: "2019-1-3",
        amount: 40,
        ...
    }
]
[
    {
        date: "2019-1-1", // this is now a unique date
        amount: 60,       // and the amount was totaled
        ...
    },
    {
        date: "2019-1-2",
        amount: 40,
        ...
    },
    {
        date: "2019-1-3",
        amount: 40,
        ...
    }
]

我的方法是创建一个以日期为键的对象,然后可以迭代数组,如果不存在,则创建一个新的date属性,如果存在,则增加数量,然后将其转换回数组:

const items = data.reduce((acc, curr) => {
    if (!acc[curr.date]) {  // basically creating a property with the date as the key and the value is the current object
        acc[curr.date] = { ...curr };
    } else {    // if it exists already, then just increment the amount
        acc[curr.date].amount += curr.amount;
    }
    return acc;
}, {});

const newArray = Object.values(items);  // grab all the values from the object above
你可以这样做

var data=[{date:“2019-1-1”,//这是一个重复的日期
金额:20},
{日期:“2019-1-1”,//这是一个重复的日期
金额:40},
{日期:“2019-1-2”,
金额:40},
{日期:“2019-1-3”,
金额:40}
],
结果=对象.values(数据.reduce((r,d)=>r[d.date]?(r[d.date].amount+=d.amount,r)
:(r[d.date]=d,r),{});

控制台日志(结果)
使用
.reduce
通过迭代数组的属性,将数组缩减为对象(或任何其他对象)。首先,您只需测试累加器中是否已存在具有匹配日期的对象:

const输入=[
{
日期:“2019-1-1”//这是重复日期
金额:20,
福:“酒吧”,
},
{
日期:“2019-1-1”//这是重复日期
金额:40,
福:“酒吧”,
},
{
日期:“2019-1-2”,
金额:40,
福:“酒吧”,
},
{
日期:“2019-1-3”,
金额:40,
福:“酒吧”,
}
];
常量输出=输入。减少((累计,项目)=>{
const{date,amount}=项目;
const foundObj=accum.find({date:findDate})=>findDate==date);
if(foundObj){
foundObj.amount+=金额;
返回累计;
}
累计推力(项);
返回累计;
}, []);

控制台日志(输出)请包含您已输入的代码written@AluanHaddad是否有一条规则我看不到,需要代码的问题?我看不出来。我问的是如何做到这一点,而不是为什么我的代码不起作用。我问的是帮助您解决您编写的代码的问题,而不是为您编写代码。请看@RobG谢谢,我将在下一个问题中考虑到这一点。我想指出的是,在那一页上,它并没有真正说明:“并不是所有的问题都能从包含代码中获益。但是,如果您的问题是您编写的代码,那么您应该包含一些。”可能该页面需要更新?另一个问题是,您的方法会对原始对象进行变异。如果这是您所指的,我也会更改变量名。啊,nvm我明白您的意思了,它仍然引用内存中的原始对象;不管用来引用原始对象的变量名是什么,原始对象都会发生变化。这不是个好主意,它会使原始对象发生变化。@CertainPerformance您可能是对的。在这种情况下,我认为最好将
r[d.date]=d
更改为
r[d.date]=Object.assign({},d)
。只有代码的答案才有帮助,一个好的答案应该包括对代码如何工作的解释。