JavaScript减少两个以上项目的抛出错误

JavaScript减少两个以上项目的抛出错误,javascript,Javascript,我有这个阵列: const arr = [ { someProp: [{ amount: 10 }]}, { someProp: [{ amount: 12 }]}, ]; 然后这减少了fn: const sum = arr.reduce((prev, curr) => prev.someProp[0].amount + curr.someProp[0].amount); 如果数组中有两个项目,但抛出三个项目,则该选项有效: 无法读取未定义“的属性“0”,因为您正在返回一个数字

我有这个阵列:

const arr = [
  { someProp: [{ amount: 10 }]},
  { someProp: [{ amount: 12 }]},
];
然后这减少了fn:

const sum = arr.reduce((prev, curr) => prev.someProp[0].amount + curr.someProp[0].amount);
如果数组中有两个项目,但抛出三个项目,则该选项有效:


无法读取未定义“

的属性“0”,因为您正在返回一个数字。
prev
的值始终是回调中的前一个返回值,而不是前一个元素。因此,在第三次迭代中,您试图将该数字当作对象引用来使用

将第二个参数(0)添加到
.reduce()
调用中,并将函数更改为将
prev
视为运行总数(一个简单的数字):


当有两个元素时,它会按原样工作,因为如果没有第二个参数,第一次迭代会将元素0视为
prev
,将元素1视为
curr
。当您有一个数字数组,并且您只想在它们之间执行计算时,这种行为可以正常工作,但在这种情况下,您需要初始值expl这里是第二个参数。

您正在返回一个数字。
prev
的值始终是回调函数的前一个返回值,而不是前一个元素。因此,在第三次迭代中,您尝试使用该数字,就好像它是一个对象引用一样

将第二个参数(0)添加到
.reduce()
调用中,并将函数更改为将
prev
视为运行总数(一个简单的数字):


当有两个元素时,它会按原样工作,因为如果没有第二个参数,第一次迭代会将元素0视为
prev
,将元素1视为
curr
。当您有一个数字数组,并且您只想在它们之间执行计算时,这种行为可以正常工作,但在这种情况下,您需要初始值expl这里是第二个参数。

实际上,您只需要返回累加器+新值

我想您需要以
0
开始,因此需要添加
0
作为第二个参数

const-arr=
[
{someProp:[{amount:10}]},
{someProp:[{amount:12}]},
{someProp:[{amount:12}]},
];
const sum=arr.reduce((会计科目,项目)=>item.someProp[0]。金额+会计科目,0);

console.log(sum);
实际上,您只需要返回累加器+新值

我想您需要以
0
开始,因此需要添加
0
作为第二个参数

const-arr=
[
{someProp:[{amount:10}]},
{someProp:[{amount:12}]},
{someProp:[{amount:12}]},
];
const sum=arr.reduce((会计科目,项目)=>item.someProp[0]。金额+会计科目,0);

console.log(sum);
在@Pointy answer之后,您可以通过以下方式使其与任意数量的元素一起工作:

const sum = arr.reduce((prev, curr) => prev + curr.someProp[0].amount, 0);

prev
始终是先前返回的元素,因此您可以安全地将其用作一个数字(由于您只是对其求和,因此可以使用
0
作为默认值,因此第一次调用
reduce
prev
的值将为0)

以下是@Pointy答案,这是如何让它与任意数量的元素一起工作:

const sum = arr.reduce((prev, curr) => prev + curr.someProp[0].amount, 0);

prev
始终是先前返回的元素,因此您可以安全地将其用作数字(由于您只是对其求和,因此可以使用
0
作为默认值,因此第一次调用
reduce
时,
prev
的值将为0)

这是另一种解决方案…使用
Array.filter()

const arr=[{
someProp:[{
金额:10
}]
},
{
someProp:[{
金额:12
}]
},
{
someProp:[{
金额:-231
}]
},
{
someProp:[{
金额:21265
}]
},
{
someProp:[{
金额:1239
}]
},
{
someProp:[{
金额:-6
}]
},
];
常量和=arr.filter((val,index)=>{
如果(索引>0){
arr[index].someProp[0].amount=parseInt(val.someProp[0].amount)+parseInt(arr[index-1].someProp[0].amount);
}
返回索引==arr.length-1;
})[0]。someProp[0]。金额;

console.log(sum);
这是另一种解决方案…使用
Array.filter()

const arr=[{
someProp:[{
金额:10
}]
},
{
someProp:[{
金额:12
}]
},
{
someProp:[{
金额:-231
}]
},
{
someProp:[{
金额:21265
}]
},
{
someProp:[{
金额:1239
}]
},
{
someProp:[{
金额:-6
}]
},
];
常量和=arr.filter((val,index)=>{
如果(索引>0){
arr[index].someProp[0].amount=parseInt(val.someProp[0].amount)+parseInt(arr[index-1].someProp[0].amount);
}
返回索引==arr.length-1;
})[0]。someProp[0]。金额;

console.log(sum);
嗨,我似乎无法让它工作:如果你打开控制台,你会看到错误嗨,我似乎无法让它工作:如果你打开控制台,你会看到错误这是我(和)看不到使用
reduce
的价值的众多原因之一;请使用循环。干净、简单、清晰。(除了在带有预构建的、经过测试的reducer函数的函数编程项目中)相对于它的值来说,它太复杂了。这就是为什么我(和)看不到使用
reduce
的价值的原因之一;而是使用循环。干净、简单、清晰。(除了在一个带有预构建的、经过测试的reducer函数的函数编程项目中)相对于它的值来说,它太复杂了。