質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2226閲覧

もとの配列に影響があるかどのように確認できますか?

退会済みユーザー

退会済みユーザー

総合スコア0

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/06/21 12:22

編集2018/06/21 13:38

現在、基礎から学ぶVue.jsの書籍を見て勉強しています。

JavaScriptとVue.jsの初学者です(><)

CHAPTER4 ソート機能を追加しよう に下記の説明があります。

配列メソッドのsortは、配列を直接、操作するため、もとのデータの順番も変わってしまいます。算出プロパティ内でもとのデータに対して使用するべきではありません。次のように配列をシャローコピーをして使用したり、Lodashなどのライブラリを使用しましょう。

下記がコードです。

html

1<div id="app"> 2 <input v-model.number="budget"> 円以下に絞り込む 3 <input v-model.number="limit"> 件を表示 4 <button v-on:click="order=!order">切り替え</button> 5 <p>{{ matched.length }} 件中 {{ limited.length }} 件を表示中</p> 6 <ul> 7 <!-- v-forでは最終結果、算出プロパティのlimitedを使用する --> 8 <li v-for="item in limited" v-bind:key="item.id"> 9 {{ item.name }} {{ item.price }}円 10 </li> 11 </ul> 12</div>

javascript

1new Vue({ 2 el: '#app', 3 data: { 4 order: false, 5 // フォームの入力と紐付けるデータ 6 budget: 300, 7 // 表示件数 8 limit: 2, 9 // 元になるリスト 10 list: [ 11 { id: 1, name: 'りんご', price: 100 }, 12 { id: 2, name: 'ばなな', price: 200 }, 13 { id: 3, name: 'いちご', price: 400 }, 14 { id: 4, name: 'おれんじ', price: 300 }, 15 { id: 5, name: 'めろん', price: 500 } 16 ] 17 }, 18 computed: { 19 // budget以下のリストを返す算出プロパティ 20 matched: function() { 21 return this.list.filter(function(el) { 22 return el.price <= this.budget 23 }, this) 24 }, 25 // sortedを新しく追加 26 sorted: function() { 27 return _.orderBy(this.matched, 'price', this.order ? 'desc' : 'asc') 28 }, 29 // limitedで使用するリストをsortedに変更 30 limited: function() { 31 return this.sorted.slice(0, this.limit) 32 } 33 } 34})

orderByを記述しているので Lodash を利用しているかと思います。

Lodashについて知らなかったので調べると 細かすぎるけど伝わって欲しいlodash.jsの話 - KAYAC に下記の説明がありました。

破壊的(元の配列の順番を変えてしまう)なので注意

orderByは元の配列に影響を与えるのでしょうか?

それは console.log などで確認する方法はありますか?

先程のVueのコードの場合、どこにconsole.log などを記述すると元の配列影響があるかどうか確認できますか?

ご存知の方、教えてくださいm(__)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

下記のようにすればそれぞれの配列表示しますので一目瞭然。

js

1 sorted: function() { 2 var ordered = _.orderBy(this.matched, 'price', this.order ? 'desc' : 'asc') 3 4 console.log("== this.list ==") 5 for (var l of this.list) { 6 console.log(JSON.stringify(l)); 7 } 8 console.log("== this.matched ==") 9 for (var m of this.matched) { 10 console.log(JSON.stringify(m)); 11 } 12 console.log("== ordered ==") 13 for (var o of ordered) { 14 console.log(JSON.stringify(o)); 15 } 16 17 return ordered 18 },

ちなみに、lodashのorderbyですが公式ドキュメントには

Returns

(Array): Returns the new sorted array.

とあり new sorted arrayを返すので非破壊ではないかと思います。

lodash - 4.17.10#orderBy

検証用コード

js

1var orig = [{name:"c"},{name:"a"},{name:"b"}]; 2console.dir(JSON.stringify(orig); // [{"name":"c"},{"name":"a"},{"name":"b"}] 3var sorted = _.sortBy(orig, 'name'); 4console.dir(JSON.stringify(orig)); // [{"name":"c"},{"name":"a"},{"name":"b"}] 5console.dir(JSON.stringify(sorted)); // [{"name":"a"},{"name":"b"},{"name":"c"}]

投稿2018/06/21 15:33

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/21 15:52

おお、consoleに表示されました!! 記述で一部理解できてないところがあるので、調べて理解を深めます。 lodashについても回答ありがとうございます。 orderbyは非破壊なのですね。 しかも、検証用コードまでありがとうございます。 お陰様で理解が深まりました。ありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問