回答編集履歴
1
追加の解説を追記。
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
|
+
|