JavaScript の Array クラスを拡張してオブジェクトが含まれているか検索する

配列の中に要素が含まれているか検索したい時に、

var sample = ["foo", "bar"];
if ("bar" in sample)
    ... 

みたいな使い方をしたかったんだけど、
if-in はオブジェクトのプロパティ検索には使えても配列には使えないので、
Array クラスを拡張してみた。

/**
 * 配列にオブジェクトが含まれているか検索する
 *
 * @param {Object} オブジェクト
 * @return boolean 含まれていれば true
 *
 * @example
 * >>> var test = [1, 2, [3, 4], {foo: "bar"}, [5, 6]];
 * >>> test.contains([3, 4]);
 * true
 * >>> test.contains([1, 2]);
 * false
 * >>> test.contains({foo: "bar"});
 * true
 */
Array.prototype.contains = function(value) {
    for (var i in this)
        if (this.hasOwnProperty(i) && this[i].toString() === value.toString())
            return true;
    return false;
};
広告

JavaScript の Array クラスを拡張して要素番号を指定せずに削除する

JavaScript の配列の要素を削除するには、delete や splice を使う方法がありますが、この場合は要素番号を指定する必要があります。

削除対象である要素の要素番号を求めるのが面倒だったので、削除したい要素の値を与えることで削除ができるように Array クラスを拡張することにしました。
拡張した Array クラスは、与える要素が文字や数値だけでなく、配列や連想配列にも対応しています。

/**
 * 配列に対象オブジェクトが含まれていたら削除する
 *
 * @param {Object} 削除したいオブジェクト
 * @return {Object} 削除したオブジェクト。含まれていない場合は false
 *
 * @example
 * >>> var test = [1, 2, [3, 4], {foo: "bar"}, [5, 6]];
 * >>> test.remove([3, 4]);
 * >>> console.log(test)
 * [1, 2, {foo: "bar"}, [5, 6]]
 * >>> test.remove({foo: "bar"});
 * >>> console.log(test);
 * [1, 2, [5, 6]]
 * 
 */
Array.prototype.remove = function(value) {
    for (var i in this)
        if (this.hasOwnProperty(i) && this[i].toString() === value.toString())
            return this.splice(i, 1)[0];
    return false;
};

JavaScript の String クラスを拡張して文字列を一括置換する

コーディング中に、(@tell_kみたいに) ついカッとなって、
JavaScript の Stringクラスを拡張してしまった。
引数に、文字列だけでなく配列や連想配列を渡せます。

/**
 * 文字列を一括置換します。
 *
 * @example
 * >>> "Hello World!!".replaceAll("o", "x")
 * "Hellx Wxrld!!"
 *
 * >>> "%s: %s (by %s)".replaceAll("%s", ["2012/03/03", "こんにちは世界!", "ryuzi"])
 * "2012/03/03: こんにちは世界! (by ryuzi)"
 *
 * >>> var data = {$date: "2012/03/03", $msg: "こんにちは世界!", $user: "ryuzi"};
 * >>> "$date: $msg (by $user)".replaceAll(data)
 * "2012/03/03: こんにちは世界! (by ryuzi)"
 */
String.prototype.replaceAll = function() {
    if (arguments.length == 2) {
        var src = arguments[0];
        var dist = arguments[1];
        if (typeof src == "string") {
            if (typeof dist == "string") {
                return this.split(src).join(dist);
            } else if (typeof dist == "object" && typeof dist.length == "number") {
                var result = this;
                for (var i=0; i<= dist.length; i++)
                    result = result.replace(src, dist[i]);
                return result;
            }
        }
    } else if (arguments.length == 1) {
        var dist = arguments[0];
        if (typeof dist == "object") {
            if (typeof dist.length == "undefined") {
                var result = this;
                for (key in dist)
                    result = result.replace(key, dist[key]);
                return result;
            }
        }
    }
    return Error("replaceAll の引数指定が正しくありません");
};