web-dev-qa-db-fra.com

Comment utiliser array reduction avec condition en JavaScript?

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.

5
wobsoriano

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)
15
T4rk1n

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>

6
Alexander Higgins

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())

5
Mμ.

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

3
dork

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);
1
Narendra Manam