JavaScriptの配列は結合して比較する
次のように変数のaとbに配列[1, 2, 3]を代入します。
aとbは同じはずですが、比較するとなぜかfalseになります。
var a, b;
a = [1, 2, 3];
b = [1, 2, 3];
document.write(a == b);//false
a = [1, 2, 3];
b = [1, 2, 3];
document.write(a == b);//false
配列の比較は次のように一つずつチェックする方法が考えられます。
面倒です。
var a, b;
a = [1, 2, 3];
b = [1, 2, 3];
document.write(array_compare(a, b));
function array_compare(a, b) {
var i;
if(a.length != b.length) {
return false;
} else {
for(i = 0; i < a.length; i++) {
if(a[i] != b[i]) {
return false;
}
}
return true;
}
}
a = [1, 2, 3];
b = [1, 2, 3];
document.write(array_compare(a, b));
function array_compare(a, b) {
var i;
if(a.length != b.length) {
return false;
} else {
for(i = 0; i < a.length; i++) {
if(a[i] != b[i]) {
return false;
}
}
return true;
}
}
そこで次のようにjoinで結合して比較します。
var a, b;
a = [1, 2, 3];
b = [1, 2, 3];
document.write(a.join() == b.join());//true
a = [1, 2, 3];
b = [1, 2, 3];
document.write(a.join() == b.join());//true
「a.join() == b.join()」は「"1,2,3" == "1,2,3"」ですのでtrueとなります。
「a.toString() == b.toString()」としても同じです。
ただし次のような意地悪なケースはダメです。
var a, b;
a = ["1", "2,3"];
b = ["1,2", "3"];
document.write(a == b);//false
document.write(a.join() == b.join());//true
a = ["1", "2,3"];
b = ["1,2", "3"];
document.write(a == b);//false
document.write(a.join() == b.join());//true
aとbは明らかに違いますが、結合すると両方とも「1,2,3」になってしまうからです。
このような場合は「join("x")」など適当な文字で挟むのがよいかもしれません。
[ 2014年8月14日 | カテゴリー: JavaScript | タグ: tips , 配列 ]
« 本当に右投げ左打ちはバントが下手か? | Wordの一文字ぶら下げを行うマクロ »
コメントを残す