如何在 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 sum
。 reduce
遍历每个项目并期望一个 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/
所以我有一个数组
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 sum
。 reduce
遍历每个项目并期望一个 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/