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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

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

Q&A

解決済

2回答

3205閲覧

何故、for文が重複する値を排除できたのか

aaaaaaaa

総合スコア501

JavaScript

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

0グッド

0クリップ

投稿2018/06/05 10:19

編集2018/06/06 10:31

下記のソースは、受け取った配列から重複する値を排除する関数です。
重複する値を排除する処理は。最初のfor文で行っていると思うのですが、これって具体的にどうやって排除しているのでしょうか。

javascript

1var unique = function(array) { 2 var obj ={}; 3 var res =[]; 4 console.log("a",array); 5//この段階で同じ数字を除去しているようだ 6for(var i=0, len =array.length;i < len;i++){ 7 obj[array[i]]= ""; 8 console.log(i,obj); 9} 10for(var k in obj) {// 11 res.push(k); 12 console.log(k,res) 13} 14return res; 15}; 16var aaa=unique([1,2,5,5,1,3,1,2,4,3,"a"]); 17console.log(aaa);

ブレイクスルーjavascript92p

0 {1: ""} (index):23 1 {1: "", 2: ""} (index):23 2 {1: "", 2: "", 5: ""} (index):23 3 {1: "", 2: "", 5: ""} (index):23 4 {1: "", 2: "", 5: ""} (index):23 5 {1: "", 2: "", 3: "", 5: ""} (index):23 6 {1: "", 2: "", 3: "", 5: ""} (index):23 7 {1: "", 2: "", 3: "", 5: ""} (index):23 8 {1: "", 2: "", 3: "", 4: "", 5: ""} (index):23 9 {1: "", 2: "", 3: "", 4: "", 5: ""} (index):23 10 {1: "", 2: "", 3: "", 4: "", 5: "", a: ""}

コンソール画面をみても何故、このfor文で排除できるのかいまいちわかりません。どうなっているのでしょうか。


ご回答ありがとうございます。
もう一点、質問させてください。

(index):23 4 {1: "", 2: "", 5: ""}
(index):23 5 {1: "", 2: "", 3: "", 5: ""}
上記のコンソール画面をみるとあとから挿入された3が5の前に来ています。恐らく前に挿入された数値より低いからだと思うのですが、どこで後から挿入された数値(3)を先に挿入された数値(5)より先に置くという処理が行われているのでしょうか。

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

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

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

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

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

LineOfLightning

2018/06/12 01:37

別に順番を並び替えてるわけではありません。というか、順番を保持してません。objは連想配列であって、配列ではないからです。
guest

回答2

0

配列に2回以上 1 が現れたとすると array[i] == 1 となるケースが複数回起こるので、次のようなコードが実行されたことになりますよね?

> let obj = {} undefined > obj {} > obj[1] = ""; '' > obj { '1': '' } > obj[1] = ""; '' > obj { '1': '' }

同じキーの値をオブジェクトに登録しようとするので、単純に上書きになって重複が消えるんです。

投稿2018/06/05 10:44

mather

総合スコア6753

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

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

0

ベストアンサー

すでに回答があるように排除というより、上書きされてるという状況ですね。
obj[array[i]]= "";ここだけ抜粋してみましょう。
unique関数の引数に配列を渡しています

javascript

1var aaa = unique([1,2,5,5,1,3,1,2,4,3,"a"]);

この引数を関数内でfor文を使って回しています。
そのfor文の中に出てくるのが

javascript

1obj[array[i]]= "";

↑こちらです。
iには0からのインデックスが入るので、

javascript

1obj[array[i]]= "";

↑この記述は、引数として渡されている配列のインデックス0番目の値である1が入るので、

javascript

1obj[1]= "";

このように記述してるのと同じです。
次にインデックス1番目の値である2が入るので、

javascript

1obj[2]= "";

このように記述してるのと同じです。

そのように見ていくと、インデックス2番目と3番目の値は5です。
それは、

javascript

1obj[5]= "";

これを2回繰り返してるのと同じことです。

つまり、上書きしてるわけですね。

そのため、この関数返される値には同一の値が存在しない。ということになっています。

投稿2018/06/05 15:05

編集2018/06/05 15:07
souta-haruran

総合スコア88

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問