如何在JavaScript中使用带条件的数组reduce?
所以我有一个数组如何在JavaScript中使用带条件的数组reduce?,javascript,arrays,vue.js,computed-properties,Javascript,Arrays,Vue.js,Computed Properties,所以我有一个数组 const records = [ { value: 24, gender: "BOYS" }, { value: 42, gender: "BOYS" }, { value: 85, gender: "GIRLS" }, { value: 12, gender: "GIRLS" },
const records = [
{
value: 24,
gender: "BOYS"
},
{
value: 42,
gender: "BOYS"
},
{
value: 85,
gender: "GIRLS"
},
{
value: 12,
gender: "GIRLS"
},
{
value: 10,
gender: "BOYS"
}
]
我想得到sum
,所以我使用了JavaScript数组reduce函数,并且得到了正确的结果。这是我的密码:
someFunction() {
return records.reduce(function(sum, record){
return sum + record.value;
}, 0);
}
通过该代码,我得到了正确的值173
。现在我想做的是,把所有的总和只加到那些得到了“BOYS”
性别的对象上
我试过类似的东西
someFunction() {
return records.reduce(function(sum, record){
if(record.gender == 'BOYS') return sum + record.value;
}, 0);
}
但我什么也得不到。我是不是遗漏了什么?任何帮助都将不胜感激。当您从reduce函数中不返回任何内容时,它将返回undefined和undefined+1==NaN。您应该在减少之前过滤数组
records.filter(({gender}) => gender === 'BOYS')
.reduce((sum, record) => sum + record.value)
如果您的条件不匹配,您需要返回当前总和,而不是
未定义的
否则,您不会将累加器返回到reduce函数,并在匹配时添加未定义的+record.value,或在不匹配时添加未定义的+未定义的
试试这个:
常量记录=[{
数值:24,
性别:“男孩”
},
{
价值:42,
性别:“男孩”
},
{
价值:85,
性别:“女孩”
},
{
数值:12,
性别:“女孩”
},
{
数值:10,
性别:“男孩”
}
];
函数someFunction(){
返回记录。减少(函数(总和,记录){
return(record.gender!=“BOYS”)?sum:sum+record.value;
}, 0);
}
log(someFunction());
如果性别为“女孩”,则返回未定义。添加一个返回sum的else语句,应该可以解决这个问题
const记录=[
{
数值:24,
性别:“男孩”
},
{
价值:42,
性别:“男孩”
},
{
价值:85,
性别:“女孩”
},
{
数值:12,
性别:“女孩”
},
{
数值:10,
性别:“男孩”
}
]
函数someFunction(){
返回记录。减少(函数(总和,记录){
if(record.gender==“BOYS”)返回sum+record.value;
否则返回金额;
}, 0);
}
console.log(someFunction())
当性别为GIRLS
时,还应返回sum
<代码>减少遍历每个项目,并期望返回一个值。如果不返回
值,则该值将未定义
。因此,在第三次迭代之后,和
将是未定义的
const sumBoys = records.reduce((sum, record) => {
if (record.gender.toLowerCase() === 'boys') {
return sum + record.value;
}
return sum;
}, 0);
const记录=[{
数值:24,
性别:“男孩”
}, {
价值:42,
性别:“男孩”
}, {
价值:85,
性别:“女孩”
}, {
数值:12,
性别:“女孩”
}, {
数值:10,
性别:“男孩”
}];
const sumBoys=记录减少((总和,记录)=>{
if(record.gender.toLowerCase()=='boys'){
返回和+记录值;
}
回报金额;
}, 0);
控制台日志(sumBoys)代码>您正在尝试检索哪个对象的性别是“男孩”。但有些对象在那个时候具有女性性别,它将返回未定义
尝试此操作以避免未定义的
var resSet=records.filter(function(options){
return options.gender == "BOYS";
}).reduce(function(a,b){
return a+parseInt(b.value);
},0);
console.log("the sum of boys set is --"+resSet);
好的,如果您只想坚持使用reduce
,而不想使用filter
,您可以这样做:
const记录=[
{
数值:24,
性别:“男孩”
},
{
价值:42,
性别:“男孩”
},
{
价值:85,
性别:“女孩”
},
{
数值:12,
性别:“女孩”
},
{
数值:10,
性别:“男孩”
}
];
var res=记录.reduce(函数(总和,记录){
如果(record.gender==‘BOYS’){
返回和+记录值;
}否则{
回报金额
};
}, 0);
控制台日志(res)代码>我们可以使用这个简化的代码
let res= records.reduce(function(a,b){
return (b.gender === "BOYS" && (a+parseInt(b.value))) || a;
}, 0);
您得到了一个错误,因为在每个元素i中,reduce method iterate。数组并返回.contracted值
发生的情况是,当您的条件不满足时,累加器的值变得.undefined,因为您没有返回它
如果满足.条件,则需要先求和。
在if作用域之外,返回总和,这是正确的方法,您可以将代码重新格式化为两行吗+1,但它不能解释原始错误的原因。相反,它只是消除了它。@AlexanderHiggins这是因为这些项被添加到了undefined中,所以他得到了NaN(()=>{})(()=>{})(+1===NaN