J'ai donc un tableau
const records = [
{
value: 24,
gender: "BOYS"
},
{
value: 42,
gender: "BOYS"
},
{
value: 85,
gender: "GIRLS"
},
{
value: 12,
gender: "GIRLS"
},
{
value: 10,
gender: "BOYS"
}
]
Et je veux obtenir la sum
alors j'ai utilisé la fonction de réduction de tableau JavaScript et je l'ai bien compris. Voici mon code:
someFunction() {
return records.reduce(function(sum, record){
return sum + record.value;
}, 0);
}
Avec ce code, j'obtiens la valeur 173
qui est correcte. Maintenant, ce que je voulais faire, c’est d’obtenir la totalité de la somme uniquement aux objets qui ont un genre "BOYS"
.
J'ai essayé quelque chose comme
someFunction() {
return records.reduce(function(sum, record){
if(record.gender == 'BOYS') return sum + record.value;
}, 0);
}
Mais je ne reçois rien. Est-ce que j'ai râté quelque chose? Toute aide serait très appréciée.
Lorsque vous ne renvoyez rien dans la fonction de réduction, il retourne indéfini et indéfini + 1 === NaN. Vous devriez plutôt filtrer le tableau avant de réduire.
records.filter(({gender}) => gender === 'BOYS')
.reduce((sum, record) => sum + record.value)
Vous devez renvoyer la somme actuelle et non pas undefined
si votre condition ne correspond pas.
Sinon, vous ne renvoyez pas votre accumulateur à la fonction de réduction et finissez par ajouter unefined
+ record.value en cas de correspondance ou undefined
+ undefined
s'il ne correspond pas.
Essaye ça:
<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>
Si le genre est 'GIRLS', il retournera indéfini. Ajoutez une instruction else qui retourne sum et cela devrait résoudre le problème.
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())
Vous devez également renvoyer la variable sum
lorsque le sexe est GIRLS
. reduce
parcourt chaque élément et attend une valeur return
. Si vous n'avez pas return
une valeur, ce sera undefined
. Donc, après la troisième itération, la sum
sera 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);
Vous essayez de récupérer quel objet ayant le genre est "GARÇONS". Mais certains objets ayant le genre Féminin à cette époque seront retournés indéfinis.
Essayez ceci pour éviter cet indéfini ....
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);