我正在参加「掘金·启航计划」
今天在做练习时,需要对对象数组中的价格属性进行求和,很自然地想到了刚学的reduce方法,但是实际使用时却出现了问题,在这里记录一下原因及解决方法,若有不正确请指出。
对象数组如下:
books:[
{name:"《算法导论》",date:"2006-9",price:85,perchaseQ:1},
{name:"《UNIX编程艺术》",date:"2006-9",price:85,perchaseQ:1},
{name:"《编程珠玑》",date:"2006-9",price:85,perchaseQ:1},
{name:"《代码大全》",date:"2006-9",price:85,perchaseQ:1},
]
reduce遍历求和如下:
return this.books.reduce((a,b)=>a.price + b.price)
但最终输出的结果为NaN,表示将不能运算的值进行了运算
查看遍历中a的内容:
return this.books.reduce((a,b)=>a)
结果:
{ "name": "《算法导论》", "date": "2006-9", "price": 85, "perchaseQ": 1 }
显然,第一次执行reduce时a为数组中第一个对象,如果要获取第一个a的price,a.price就可以做到,但注意,reduce方法中,第二次执行时a的值是上次执行后的返回值,也就是a.price + b.price的值,若对这个值再进行a.price取值,那必然是取不到的
找到了原因,就可以开始解决问题了,如果a的初始值和后来执行的值类型不同,无法正常计算,那么我们可以利用reduce中的initialValue参数,对初始a进行指定,这里指定为0,修正后代码:
return this.books.reduce((a,b)=>a + b.price,0)
b每次传入的都是下一个数组中的对象,而a则为每次函数执行后的返回值,也就是累计取和的结果