如何在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