【JavaScript】配列の比較について
まとめ
JavaScriptで、配列の比較の際に==又は===演算子を用いると、その配列が参照しているメモリ上のアドレスが同じかどうかでtrue/falseを返す。
Object.is()
も同様。
例
var list_1 = ["mike","saba","tora"]; var list_2 = ["mike","saba","tora"]; console.log(list_1 === list_2); // -> false console.log(Object.is(list_1, list_2)); // -> false
配列が全く同じであっても、比較の際に ==
===
Object.is()
を用いると false
が返る。
これは、比較対象が中の値ではなくポインタのアドレスを見ているため。
じゃあどうやって比較する?
一番楽なのは、toString()
してしまう。
もしくは(冗長になってしまうけど)配列を回して比較。
var list_1 = ["mike","saba","tora"]; var list_2 = ["mike","saba","tora"]; console.log(list_1.toString() === list_2.toString()); // -> true console.log(Object.is(list_1.toString(), list_2.toString())); // -> true
ただ、Object.is()
や ===
のようにオブジェクトを比較したいときはまたちょっと複雑そう・・・。いつか調べる。
追記
ツイッタで質問があったので。
JavaScriptの配列型にはequalsメソッドが存在しません。
[1, 2] == [1, 2]; // -> false [1, 2].equals([1, 2]); // -> Uncaught TypeError: [1,2].equals is not a function
外部キー制約 migration の foreigndrop がうまくいかない
(先に)まとめ
⭐️ 外部キー制約の drop と同時に、制約対象の key を変更や削除する場合はスキーマを分ける必要がある
✏️ 外部キー制約を drop するときは1つのスキーマでまとめて実行できる
テーブル条件
作成した migration ファイル
<?php public function up() { Schema::table('animals', function (Blueprint $table) { $table->unsignedBigInteger('kind')->change(); $table->foreign('kind')->references('id')->on('animal_kinds'); }); } public function down() { Schema::table('animals', function (Blueprint $table) { $table->dropForeign('animals_kind_foreign'); $table->bigInteger('kindId')->change(); }) }
migration を実行し、rollback した際にエラー発生
[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1832 Cannot change column 'kind': used in a foreign key constraint 'animal_kinds' (SQL: ALTER TABLE animal_kinds CHANGE kind kind BIGINT NOT NULL COMMENT '-') [Doctrine\DBAL\Driver\PDOException] SQLSTATE[HY000]: General error: 1832 Cannot change column 'kind': used in a foreign key constraint 'animal_kinds' [PDOException] SQLSTATE[HY000]: General error: 1832 Cannot change column 'kind': used in a foreign key constraint 'animal_kinds'
down() を以下のように書き換えることで成功
<?php public function down() { Schema::table('animals', function (Blueprint $table) { $table->dropForeign('animals_kind_foreign'); }); Schema::table('animals', function (Blueprint $table) { $table->bigInteger('kindId')->change(); }); }
【laravel】HasManyThrough() を使うときに規定通りに書いているにも関わらず結果が0件で困った
Eloquent:リレーション 5.4 Laravel 5.4公式サイトの表記
リレーションのクエリ実行時は、典型的なEloquentの外部キー規約が使用されます。リレーションのキーをカスタマイズしたい場合は、hasManyThroughメソッドの第3引数と、第4引数を指定してください。第3引数は仲介モデルの外部キー名、第4引数は最終的なモデルの外部キー名です。そして第5引数はローカルキーです。
Eloquent:リレーション 5.5 Laravel 5.5公式サイトの表記
リレーションのクエリ実行時は、典型的なEloquentの外部キー規約が使用されます。リレーションのキーをカスタマイズしたい場合は、hasManyThroughメソッドの第3引数と、第4引数を指定してください。第3引数は仲介モデルの外部キー名、第4引数は最終的なモデルの外部キー名です。第5引数はローカルキーで、第6引数は仲介モデルのローカルキーです。
しかしながら、この通りに実装しても全然値が取れない。
実はこれ、第6引数までとるみたい...
<?php class First extends Model { public function Third() { return $this->hasManyThrough( 'App\Third', 'App\Second', 'C_id', 'A_id', null, 'B_id' ); } }
上記のような「FirstクラスからSecondクラスを経由してThirdクラスのデータを取得したい」場合、
hasManyThroughメソッドに渡す引数は順に、
- 最終的にデータを取得するクラス(Third)...'App\Third'
- 経由するクラス(Second)...'App\Second'
- 経由するクラス(Second)と呼び出し元(First)を繋ぐキー...'C_id'
- 呼び出し元(First)のマスターキー...'A_id'
よくわからないやつ👹呼び出し元(First)のローカルキー...null- 経由するクラス(Second)と最終的にデータを取得するクラス(Third)を繋ぐキー...'B_id' となる。
5番目の「よく分からないやつ」「呼び出し元(First)のローカルキー」にはnull
を渡すとうまくいった...これはいったいなんなのか???
これ、指定しなくてもいいんだねぇ......謎
😱💬 最初はこういう書き方してたせいで結果が0件だった.
そりゃ経由するクラス(Second)と最終的にデータを取得するクラス(Third)を繋ぐキーがなければ結果が出るはずもないよね. 反省.
<?php class First extends Model { public function Third() { return $this->hasManyThrough( 'App\Third', 'App\Second', 'C_id', 'A_id', 'B_id' ); } }
😭💬 教訓:ちゃんとバージョンにあったドキュメント読みましょうね.