Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Json - Fatal编程技术网

JavaScript:按公共项字段组合项值列表

JavaScript:按公共项字段组合项值列表,javascript,arrays,json,Javascript,Arrays,Json,我正在尝试组合我的列表数组中的项目,以便在生成的数组中只有唯一的日期字段。我还需要结果数组中项目的amount字段是原始数组中共享相同date值的所有项目的总和 我的列表中的数据格式如下所示: var list = [ {amount: "10", date: "2000-03-01"},// These three records have same date {amount: "20", date: "2000-03-01"},// field, need to combine i

我正在尝试组合我的
列表
数组中的项目,以便在生成的数组中只有唯一的
日期
字段。我还需要结果数组中项目的
amount
字段是原始数组中共享相同
date
值的所有项目的总和

我的
列表中的数据格式如下所示:

var list = [
  {amount: "10", date: "2000-03-01"},// These three records have same date 
  {amount: "20", date: "2000-03-01"},// field, need to combine into
  {amount: "30", date: "2000-03-01"},// one record
  {amount: "50", date: "2000-03-03"},
  {amount: "100", date: "2000-03-05"},
  {amount: "30", date: "2000-03-06"},// These two records have same date 
  {amount: "70", date: "2000-03-06"},// field, need to combine
  {amount: "80", date: "2000-03-10"},
]
我需要将上面的列表转换为:

var expectedList = [
  {amount: "60", date: "2000-03-01"}, // combined item
  {amount: "50", date: "2000-03-03"},
  {amount: "100", date: "2000-03-05"},
  {amount: "100", date: "2000-03-06"},// combined item
  {amount: "80", date: "2000-03-10"},
]

您可以使用reduce函数来实现这一点

list.reduce(( prev, curr )=>{
    // parse string amount into number for calculation
    curr.amount = parseInt(curr.amount);

    let index;

    if ((index = prev.findIndex( item => item.date == curr.date )) > -1 )
        prev[index].amount += curr.amount;
    else
        prev.push( curr );

    return prev;

}, []);
输出:

[ { amount: 60, date: '2000-03-01' },
  { amount: 50, date: '2000-03-03' },
  { amount: 100, date: '2000-03-05' } ]

如果您想要简单易懂的代码,请使用下面代码段中的代码

下面的代码基本上在列表中循环,然后在输出中循环,以检查这两个元素的日期是否相同。如果是,它将添加金额并将
found
的值设置为true。在结束时,如果
found
仍然为false(如果我们没有找到日期匹配的元素),我们将值推送到输出数组

var列表=[
{金额:“10”,日期:“2000-03-01”},
{金额:“20”,日期:“2000-03-01”},
{金额:“30”,日期:“2000-03-01”},
{金额:“50”,日期:“2000-03-03”},
{金额:“100”,日期:“2000-03-05”},
]
var输出=[];
var=false;
list.forEach(e1=>{
发现=错误;
output.forEach(e2=>{
如果(e1.date==e2.date){
e2.amount=parseInt(e2.amount)+parseInt(e1.amount);
发现=真;
}
});
如果(!找到){
输出推送(e1);
}
});

控制台日志(输出)一种解决方案可以是通过
Array.reduce()
首先构建一个中间映射,将
date
键映射到
amount
值的合计。然后通过
Object.entries()
将映射转换回平面数组,如下所示:

var列表=[
{金额:“10”,日期:“2000-03-01”},
{金额:“20”,日期:“2000-03-01”},
{金额:“30”,日期:“2000-03-01”},
{金额:“50”,日期:“2000-03-03”},
{金额:“100”,日期:“2000-03-05”},
]
const result=Object.entries(list.reduce)(映射,项)=>{
/*在列表的每个reduce迭代期间,检索
此项目“日期”的合计“金额”*/
映射[item.date]=映射[item.date]| | 0
/*将该“日期”的“总计”增加“金额”
当前项,并保留到映射中*/
映射[item.date]+=Number.parseInt(item.amount)
返回映射
},{}).map(([金额,日期])=>{
/*Object.entries()从
由reduce()步骤创建的映射
映射回所需格式的键/值对*/
返回{金额,日期}
});

log(result)
似乎是一个相当简单的两步过程。首先,将数组缩减为日期映射以求和,然后将该映射的值转换为新数组

var列表=[
{金额:“10”,日期:“2000-03-01”},
{金额:“20”,日期:“2000-03-01”},
{金额:“30”,日期:“2000-03-01”},
{金额:“50”,日期:“2000-03-03”},
{金额:“100”,日期:“2000-03-05”}
]
const expectedList=Array.from(list.reduce)((map,{amount,date})=>{
返回map.set(日期,(map.get(日期)| | 0)+parseInt(金额))
},new Map())。Map(([date,amount])=>({amount,date}))
控制台信息(预期列表)
var列表=[
{金额:“10”,日期:“2000-03-01”},
{金额:“20”,日期:“2000-03-01”},
{金额:“30”,日期:“2000-03-01”},
{金额:“50”,日期:“2000-03-03”},
{金额:“100”,日期:“2000-03-05”},
]
const builobject=list.reduce((acc,{date,amount})=>{
acc[日期]=acc[日期]| 0
acc[日期]+=parseInt(金额)
返回acc
}, {})
const rs=Object.entries(BuilObject.map)([date,amount])=>({amount,date}))

console.log(rs)
通过“combine”,您是指“sum”吗?而不仅仅是“sum”。还有一份新的名单你试过什么吗。。你刚刚发布了两段代码(任务和结果),就这样,在我看来你没有付出任何努力?我想你误解了。
amount
值是否通过求和将其“组合”在一起?这很公平,但您应该始终发布您的代码,即使它不起作用,这将使您有更好的机会在将来得到不那么琐碎的答案。简单的reduce+数组累加器不是更好吗,对于这样简单的任务来说,这种解决方案似乎有点复杂,因为您最终将转换为数组。至少在我看来,那些析构函数也有点太多了。另外,这对内存/性能有什么好处?@VitaliyTerziev减少到一个数组需要在每次迭代中搜索正确的记录,使其时间复杂度
O(n^2)
。缩小到一个
贴图
(或者甚至是一个普通的对象),使其成为
O(2n)
@VitaliyTerziev对象构造的使用完全是主观的。就我个人而言,我认为它看起来更整洁,但也欢迎你发表意见。ree,我没有想到数组中大(n)项的复杂性,我只是认为这对这5个对象来说可能有点过分,但你是对的。@VitaliyTerziev我一直认为问题中的数据只是一个样本