0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

オブジェクトにreduceを用いる

Posted at

vueでreduceメソッドを久しぶりに用いて混乱した部分があるので整理した。
また、オブジェクトにreduceを用いて解説した記事はなかったので自分でまとめた。
##ソースコード

index.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>

<body>
  <div id="app">
    <p>合計:{{ totalPrice }}</p>
  </div>
  <script>
    const items = [
      {
        name: '鉛筆',
        price: 300,
        quantity: 3
      },
      {
        name: 'ノート',
        price: 400,
        quantity: 4
      },
      {
        name: '消しゴム',
        price: 500,
        quantity: 1
      },
    ]
    const vm = new Vue({
      el: '#app',
      data: {
        items: items
      },
      computed: {
        totalPrice: function () {
          return this.items.reduce(function (sum, item) {
          return sum + (item.price * item.quantity)
          },0)
        },
      }
    })
  </script>
</body>

この時の reduce の挙動を totalPrice のなかで初期値などを変えつつ整理する

##ケース1:初期値を0としたとき

###ソースコード

index.html
totalPrice: function () {
          return this.items.reduce(function (sum, item) {
            return sum + (item.price * item.quantity)
          },0)
1回目 2回目 3回目
sum 0 900 2500
item オブジェクト(鉛筆の内容) オブジェクト(ノートの内容) オブジェクト(消しゴムの内容)

reduce は配列の内容を出力するので1回目の item はオブジェクト(鉛筆の内容)となります。
2回目の sum では1回目の戻り値が入るので、 sum(初期値0) + (300 * 3) の値となり900 となります。
3回目の sum では2回目の戻り値が入るので、 sum(0 + 900) + (400 * 4) の値となり2500 となります。
最後の return sum + (item.price * item.quantity) では3回目の戻り値が sum に入り 2500 + (500(消しゴムの値段) * 1)となるので 3000 となります。

##ケース2:初期値を設定しないとき
###ソースコード

index.html
totalPrice: function () {
          return this.items.reduce(function (sum, item) {
            return sum + (item.price * item.quantity)
          })
1回目 2回目 3回目
sum オブジェクト(鉛筆の内容) [object Object]1600 なし
item オブジェクト(ノートの内容) オブジェクト(消しゴムの内容) なし

1回目の sum に入る値は items[0] つまり鉛筆のオブジェクトとなるので各値は上記のようになります。
1回目の item は 配列の2番目の要素が入るので、index[1]が対象となり、 オブジェクト(ノートの内容) となります。
2回目の sum は1回目の戻り値が入るので オブジェクト(ノートの内容) + (400 * 4)となり [object Object]1600 となります。
2回目の item は配列の3番目の要素が入るので、index[2] が対象となり、 オブジェクト(消しゴムの内容) となります。
3回目の sum はすでに2回目の itemitems の要素を出力し切っているので実行されません。
3回目の item はこちらも試行回数は終わっているので実行されません。
最後の return sum + (item.price * item.quantity) では2回目の戻り値が sum に入るので、 [object Object]1600 + 500 となります。[object Object]1600は文字列とみなされてこのような表記になると思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?