回答編集履歴

1

追加の解説を追記。

2016/08/26 16:25

投稿

flied_onion
flied_onion

スコア2604

test CHANGED
@@ -44,4 +44,166 @@
44
44
 
45
45
 
46
46
 
47
+ **追記**
48
+
49
+
50
+
47
- ちょっと追記します。
51
+ 詳しくは調べてもらうして、少し追記してみます。
52
+
53
+ 配列からある値の位置を調べるには、`Array.indexOf()` が使えます。
54
+
55
+ これは0以上ならば見つかったインデックス。見つからないときは-1を返すので、
56
+
57
+
58
+
59
+ delArrは以下の様に書けます。
60
+
61
+
62
+
63
+ ```javascript
64
+
65
+ function delArr(arr, target) {
66
+
67
+ while(arr.indexOf(target) >= 0)
68
+
69
+ arr.splice(arr.indexOf(target),1);
70
+
71
+ }
72
+
73
+ ```
74
+
75
+ whileしているのは、arrにtargetが複数見つかる可能性がある場合に備えてです。
76
+
77
+ あったとしてもかならず1つしか無いのであれば、whileはいりません。
78
+
79
+
80
+
81
+ 細かいところだと、値の比較は `===` の方が厳格に比較されます。
82
+
83
+ ざっくりいうと、 `==` だと0っぽいもの( 0に自動変換可能なもの。例えば 文字列 "0" ) も一致とみなされますが、`===` だと数値の 0以外違うものとされます。
84
+
85
+ 今回のケースでは厳密に比較したいと思うので`===`の方が良いでしょう。
86
+
87
+
88
+
89
+ ```javascript
90
+
91
+ // if (arr[c][i] == 0) continue;
92
+
93
+ if (arr[c][i] === 0) continue;
94
+
95
+ ```
96
+
97
+
98
+
99
+ 以下は参考です。
100
+
101
+ ちょっと久々にjavascriptでリスト操作関数書いてみたくなったので。
102
+
103
+ いろいろと便利な関数があるのでその紹介と思ってください。
104
+
105
+
106
+
107
+ まず、filterを使うと、値一つ一つをfilter内の関数に処理させて、関数がtrueを返さないものは除外することができます。
108
+
109
+ (その名の通りフィルターになります)
110
+
111
+
112
+
113
+ ```javascript
114
+
115
+ function getNum3(arr) {
116
+
117
+ var num = [1, 2, 3, 4, 5, 6, 7, 8 ,9];
118
+
119
+ var filtered= num.filter(function(x) {
120
+
121
+ return arr.indexOf(x) == -1;
122
+
123
+ });
124
+
125
+ return filtered;
126
+
127
+ }
128
+
129
+
130
+
131
+ console.log(getNum3(nums1[0]));
132
+
133
+ ```
134
+
135
+
136
+
137
+ 随分短くなりましたが、新しいバージョンのjavascript (ES6とか言われます)のアロー関数を使うともっと短くなります。
138
+
139
+
140
+
141
+ ```javascript
142
+
143
+ function getNum3Arrow(arr) {
144
+
145
+ var num = [1, 2, 3, 4, 5, 6, 7, 8 ,9];
146
+
147
+ return num.filter(x => arr.indexOf(x) == -1);
148
+
149
+ }
150
+
151
+
152
+
153
+ console.log(getNum3Arrow(nums1[0]));
154
+
155
+ ```
156
+
157
+
158
+
159
+ あと、reduceというリストの集計などに使われる関数もあり、それを使うと以下の様にも書けます。
160
+
161
+ reduceは説明が長くなりそうなので興味があれば調べてみてください。
162
+
163
+ (初期値を配列にしているので、説明しやすい素直なreduceでもないので)
164
+
165
+ ```javascript
166
+
167
+ function getNum4(arr) {
168
+
169
+ var num = [1, 2, 3, 4, 5, 6, 7, 8 ,9];
170
+
171
+ var result = num.reduce(function(prev, next){
172
+
173
+ if(arr.indexOf(next) == -1){ prev.push(next); }
174
+
175
+ return prev;
176
+
177
+ }, []);
178
+
179
+ return result;
180
+
181
+ }
182
+
183
+
184
+
185
+ console.log(getNum4(nums1[0]));
186
+
187
+ ```
188
+
189
+ 関数を渡してますが、nextにリストの要素が一つ一つはいってきます。filterのときみたいに。
190
+
191
+ prevは、一つ一つ処理する中で、この関数で前回returnしたものが入ってきます。
192
+
193
+ 最後に指定する引数は(今回は `[]`) は初期値です。「前回returnしたもの」と言っても、一番最初は何もreturnしてないですよね。そういうことです。最初のprevに使われます。
194
+
195
+
196
+
197
+ やってることはfilterと同じです。 indexOfの結果が -1だったらprevに回ってきたリストにそれを詰めて次、indexOfの結果が -1だったらprevに回ってきたリストにそれを詰めて次・・・です。
198
+
199
+
200
+
201
+ 長々失礼しました。こんな書き方もありますよ、という参考にどうぞ。
202
+
203
+
204
+
205
+ 動くものも置いておきます。動かないときは [Run with JS] ボタンで動きます。
206
+
207
+ [http://jsbin.com/riveheqipo/edit?js,console,output](http://jsbin.com/riveheqipo/edit?js,console,output)
208
+
209
+