2

PUREJAVASCRIPTを使用して配列内の一致を確認しようとしています。これを行う方法がわかりません。ご協力いただければ幸いです。

var sites = new Array ("site1.com", "site2.com", "site3.com" ...);
// Sites array contains 100 values

var imgs = document.getElementsByTagName("img");
    for (var i = 0; i < imgs.length; i++) {
        img = imgs[i].src;

        // I'm trying to check if is in array, 
        // and don't waste a lot of size in code

        if(img.match(sites)){
            notHere(imgs[i]);
        }

        // This is the working way.
        // Even if location is a.site1.com/b/, it will match 
        if (img.match("site1.com")) {
            heReload(imgs[i]);
        }
        // Repeat this piece of code 100 times
    }
}

:正確な値を確認したくありません。関数をシミュレートしたいmatch()ので、img = "http:// abc / d /"で、配列が "bc /"の場合、実行されfunction()ます。

4

3 に答える 3

1

フィルタの良い使用例。

「古い」ブラウザで動作させたい場合:

var nativeFilter = Array.prototype.filter;
_.filter = _.select = function(obj, iterator, context) {
    var results = [];
    if (obj == null) return results;
    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
    each(obj, function(value, index, list) {
      if (iterator.call(context, value, index, list)) results[results.length] = value;
    });
    return results;
};

何も見つからない場合は空の配列を返し、それ以外の場合は結果を含む配列を返します。

> [1,2,3,4].filter(function(item) { return item == 4 } );
[ 4 ]

ソース:Underscore.js

これで、コードは次のようになります。

var sites = new Array ("site1.com", "site2.com", "site3.com" ...);
// Sites array contains 100 values

var imgs = document.getElementsByTagName( "img" );
for ( var i = 0; i < imgs.length; i++ ) {
    var img = imgs[ i ].src;
    var result = sites._filter( function( site ) {
        return img.match( site )
    });

    // result is an array of matching sites

}
于 2012-04-30T15:10:04.767 に答える
1

「sites」変数は、配列ではなく正規表現である必要があります。

 var sites = /\b(site1\.com|site2\.com|etc|etc)\b/

後で:

 if (img.match(sites))
    ......

何らかの理由で「サイト」を配列に保持したい場合は、「オンザフライ」で正規表現を作成することもできます。

var sites = ["site1.com", "site2.com", "site3.com"]
var sitesRegexp = new RegExp("\\b(" + sites.join("|").replace(".", "\\.") + ")\\b")

 ....

 if (img.match(sitesRegexp)
    ......
于 2012-04-30T15:14:00.310 に答える
0

アレイのプロトタイプを拡張できるので、すべてのブラウザをサポートします...

これを試して :

Array.prototype.myContains = function(obj) {
    var i = this.length;
    while (i--) {if (this[i] .indexOf(obj)>-1)  return true; }
    return false;
}

利用方法 :var t=myArr.myContains(3);

于 2012-04-30T15:18:14.303 に答える