不具合の理由
items.filter()
は、配列itemsを元にして新しい配列を生成しますので、const aaa = items.filter(...)
のように、定数・変数の中に格納するのが正解です。
- 対して
result.push()
は、配列resultに直接変更を加える形で追加します。新しい配列を生成するわけではないので、定数・変数に格納すると意図しない結果となります。
result.push(aaa)
をしたら、変数に格納せず、
- そのまま、
console.log(result)
と確認をしましょう。
- また、定数
aaa
は長さが1の['あい']
という配列です。このままプッシュすると、['ああ', 'さく', 'とり', ['あい']]
という結果になってしまいます。
不具合確認用コード
こちらは不正解のコードです。質問者様の書いたコードがどのような処理になっているのか、一つ一つconsole.logで表示させて確認してみましょう。
javascript
1const items = ['ああ','あい','さく','とり'];
2
3// 'あい'だけを取り出した変数を作成
4const aaa = items.filter((e)=>{return e === 'あい'});
5console.log('aaa', aaa); // ['あい',]
6
7// 'あい'以外を取り出した配列を作成
8const result = items.filter((v)=>{return v !== 'あい'});
9console.log('result', result); // ['ああ', 'さく', 'とり']
10
11// ’あい’のない配列の末尾に'あい'を追加する
12result.push(aaa);
13console.log('result', result); // ['ああ', 'さく', 'とり', ['あい']]
おすすめの方法
質問者様のおっしゃっている通り、とても回りくどい処理をしています。
ですのでもう少し簡潔なコードにしてみました。
.splice()メソッドで要素を取り出す
.splice()
で任意の要素を取り出すといいでしょう。
元の配列に直接変更を加えるタイプのメソッドです。
さらに、変数に格納することで取り出した値が格納された配列を取得することができます。
javascript
1配列.splice(<取り出す要素のインデックス番号>, <何個取り出すかの数>)
2
3// 例
4const arr = ['a', 'b', 'c', 'd'];
5const c = arr.splice(2, 1);
6console.log(c); // ['c'];
7console.log(arr); // ['a', 'b', 'd']
.indexOf()メソッドでインデックス番号を調べる
.splice()を使うために'あい'
のインデックス番号を知らなければなりません。
インデックス番号は、.indexOf()
で調べられます。
javascript
1配列.indexOf(<検索する値>)
2
3// 例
4const arr = ['a', 'b', 'c', 'd'];
5const index = arr.indexOf('b');
6console.log(index); // 1
以上2つのメソッドを組み合わせて使用した上で、元の配列items
に取り出した'あい'
を.push()
してやるといいでしょう。
正解コード例
javascript
1const items = ['ああ','あい','さく','とり'];
2
3const [ai] = items.splice(items.indexOf('あい'), 1); // 分割代入
4console.log('ai', ai); // 'あい'
5console.log('items', items); // ['ああ', 'さく', 'とり']
6
7items.push(ai);
8console.log('items', items); // ['ああ', 'さく', 'とり', 'あい']
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/25 16:48
2022/10/25 16:49