JDBな人生  専門的なことから日常的なことまで~ まぁ自由きままに書いていきます。
2017年11月 / 10月<< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>12月

アクセスランキング

[ジャンルランキング]
コンピュータ
269位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
38位
アクセスランキングを見る>>

JavaScriptでの配列/オブジェクト同士の比較の方法

今日、JavaScriptを少し書いていたのですが、そこで気づいたことを一つ。
配列同士の比較では、単にオブジェクト同士を比較しても正確な値を得ることができません。
(参照同士の比較を行っているようです。)

例えばこんな感じ。
var a = [1,2,3];
var b = [1,2,3];
document.writeln(a == b); //false

調べてみたところ、JavaScriptでは配列等のオブジェクト同士の比較をする機能は実装されていないようです。(Javaで言うところのequalsメソッド)
追記:文字列や数値型の配列であれば'' + a == bのように文字列に変換してから比較することもできます。

というわけで、比較用のメソッドを書いてみました。
Object.prototype.equals = function(obj){
    if (this instanceof String || typeof this == "boolean" || ! this){
        return (this == obj);
    } else if (this instanceof Number){
        if (!isFinite(this))
            return !isFinite(obj);
        return (this == obj);
    } else if (typeof this == "function"){
        return (this.toString() == obj.toString());
    } else if (this instanceof Array){
        if (this.length !== obj.length)
            return false;
        for(var i=0;i<this.length;i++){
            if (this[i] == null){
                return (obj[i] == null);
            }
            if (! this[i].equals(obj[i])){
                return false;
            }
        }
        return true;
    } else {
        for(var o in this){
            if (this[o] == null){
                return (obj[o] == null);
            }
            if (! this[o].equals(obj[o])){
                return false;
            }
        }
        return true;
    }
}



var a = [1,2,3];
var b = [1,2,3];
document.writeln(a.equals(b)); //true

初めはArray.prototypeに書いていたのですが、配列の内容が何かわからないので、考えられるすべてのオブジェクトに対応できるように書き直しました。

使う機会はあまりないかもしれませんが、このような記述を行わなければいけないということは、一つ覚えておいた方がいいなあと。

#JavaScriptでinstanceofメソッドが使えるということも知りませんでした
 


 
   JavaScript    TB(0)    CM(2)    EDIT    ページ↑

コメント投稿


 管理者だけに表示

コメント

[ フラミンゴ ]
''+a == b
でいいです
2013年12月07日(土) 18:38
[ JDB Luigi ]
> ''+a == b
> でいいです
コメントありがとうございます。
配列がプリミティブ型であればその方法も使えますが、Object型の配列になっているとき、例えば以下のような場合に、本来等価でないものが等価であると判断されてしまいます。

var a = {"name": "taro"};
var b = {"name": "hanako"};

var x = [1,a,3];
var y = [1,b,3];

alert('' + x == y);

扱う型によって方法を変えるというのも検討できますね。
2013年12月07日(土) 19:15

トラックバック

この記事へのトラックバック:

プロフィール

JDB Luigi

Author:JDB Luigi
どこにでもいるようなありふれた人間・・・という訳でもなく、かと言って怪しい宗教を信仰する変人という訳でも無い。

基本的に掲載しているコード等は煮ていただいても焼いていただいても結構ですが、利用は自己責任にてお願いいします。
また、バグ・アドバイス等もしあればよろしくお願いします。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。