web-dev-qa-db-ja.com

JavaScriptで配列reduceを使用する方法は?

だから私は配列を持っています

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

しかし、何も得られません。ここに何かが足りませんか?どんな助けも大歓迎です。

9
wobsoriano

Reduce関数から何も返さない場合、undefinedおよびundefined + 1 === NaNを返します。代わりに、縮小する前に配列をフィルタリングする必要があります。

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

条件が一致しない場合、undefinedではなく現在の合計を返す必要があります。

それ以外の場合、アキュムレータを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>
8

性別が「GIRLS」の場合、未定義を返します。 sumを返すelseステートメントを追加すると、問題が修正されます。

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())
7
Mμ.

性別がsumの場合は、GIRLSも返す必要があります。 reduceは各アイテムを通過し、return値が必要です。 return値を指定しない場合、undefinedになります。したがって、3回目の反復の後、sumundefinedになります。

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

性別が「BOYS」であるオブジェクトを取得しようとしています。ただし、その時点で女性の性別を持つオブジェクトの中には、未定義を返すものがあります。

これを試して、未定義の...を避けてください。

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