如何在 JavaScript 中使用 array reduce with condition?

How to use array reduce with condition in JavaScript?

所以我有一个数组

const records = [
    {
        value: 24,
        gender: "BOYS"
    },
    {
        value: 42,
        gender: "BOYS"
    },
    {
        value: 85,
        gender: "GIRLS"
    },
    {
        value: 12,
        gender: "GIRLS"
    },
    {
        value: 10,
        gender: "BOYS"
    }
]

我想得到 sum 所以我使用了 JavaScript 数组归约函数并得到了它。这是我的代码:

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);
}

但我一无所获。我在这里错过了什么吗?任何帮助将不胜感激。

当你 return 没有从 reduce 函数中得到任何东西时,它 return 未定义和未定义 + 1 === NaN。您应该在减少之前过滤数组。

records.filter(({gender}) => gender === 'BOYS')
    .reduce((sum, record) => sum + record.value)

如果您的条件不匹配,您需要 return 当前金额而不是 undefined

否则你不会 return 将你的累加器添加到 reduce 函数并最终在匹配时添加 unefined + record.value 或 undefined + undefined 不匹配时。

试试这个:

<script>
  const records = [{
      value: 24,
      gender: "BOYS"
    },
    {
      value: 42,
      gender: "BOYS"
    },
    {
      value: 85,
      gender: "GIRLS"
    },
    {
      value: 12,
      gender: "GIRLS"
    },
    {
      value: 10,
      gender: "BOYS"
    }
  ];

  function someFunction() {
    return records.reduce(function(sum, record) {
     return (record.gender !== 'BOYS') ? sum : sum + record.value;

    }, 0);
  }
  console.log(someFunction());
</script>

如果性别是 'GIRLS',它将 return 未定义。添加一个 else 语句 returns 总和,它应该可以解决问题。

const records = [
    {
        value: 24,
        gender: "BOYS"
    },
    {
        value: 42,
        gender: "BOYS"
    },
    {
        value: 85,
        gender: "GIRLS"
    },
    {
        value: 12,
        gender: "GIRLS"
    },
    {
        value: 10,
        gender: "BOYS"
    }
]

function someFunction() {
  return records.reduce(function(sum, record){
    if(record.gender == 'BOYS') return sum + record.value;
    else return sum;
  }, 0);
}

console.log(someFunction())

当性别为 GIRLS 时,您还应该 return sumreduce 遍历每个项目并期望一个 return 值。如果您没有 return 一个值,它将是 undefined。所以在第三次迭代之后,sum 将是 undefined.

const sumBoys = records.reduce((sum, record) => {
  if (record.gender.toLowerCase() === 'boys') {
    return sum + record.value;
  }

  return sum;
}, 0);

const records = [{
  value: 24,
  gender: "BOYS"
}, {
  value: 42,
  gender: "BOYS"
}, {
  value: 85,
  gender: "GIRLS"
}, {
  value: 12,
  gender: "GIRLS"
}, {
  value: 10,
  gender: "BOYS"
}];

const sumBoys = records.reduce((sum, record) => {
  if (record.gender.toLowerCase() === 'boys') {
    return sum + record.value;
  }

  return sum;
}, 0);

console.log(sumBoys);

您正在尝试检索性别为“BOYS”的对象。但是那时一些性别为女性的对象将returns未定义。

试试这个来避免未定义的....

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 records = [
    {
        value: 24,
        gender: "BOYS"
    },
    {
        value: 42,
        gender: "BOYS"
    },
    {
        value: 85,
        gender: "GIRLS"
    },
    {
        value: 12,
        gender: "GIRLS"
    },
    {
        value: 10,
        gender: "BOYS"
    }
];

  var res = records.reduce(function(sum, record){
    if(record.gender === 'BOYS') {
       return sum + record.value;
     } else{
        return sum
    }; 
  }, 0);
  console.log(res);

  var res = records.reduce(function(sum, record){
    if(record.gender == 'BOYS') {
       return sum + record.value;
     } else{
        return sum
    }; 
  }, 0);

我们可以使用这个简化的代码

let res= records.reduce(function(a,b){ 
    return (b.gender === "BOYS" && (a+parseInt(b.value))) || a; 
}, 0);

你得到一个错误,因为 reduce 方法 iterate.in 每个元素 i。数组和 returns the.accumulated 值,

发生的事情是,当你的条件不满足时,累加器的值 becomes.undefined 因为 you.did 而不是 return 它。

满足the.condition需要先求和。 在 if 范围之外 return 总和,

假设如果 records 为空,您想要设置一个与您的输出相匹配的累加器值。此外,当 records.length === 0 与只有 BOYS 的数量为 0 时空的定义可能不同。

const defaultValue = 0, target = 'BOYS'
const result = records.reduce( (sum,{gender,value})=>{
   return gender === target ? (sum||0)+value : sum;
},defaultValue);

reduce 的一些乐趣和你的问题: https://jsfiddle.net/gillyspy/021axnsr/8/