0

私はプログラムに取り組んでおり、Javascript の違いについて少し洞察したいと思います。私のプログラムでは、以下のように、最終結果に含めることを許可されていない値を含むブラックリスト配列があります。

blacklist = ["One", "Two", "Four"]
someArr = ["One", "Three", "Five", "Two", "One"]
//Desired result = ["Three", "Five"]

別の Stack の質問 (以下に示すコード) から素晴らしいヒントを見つけました。

Array.prototype.diff = function(a) {
    return this.filter(function(i) {return !(a.indexOf(i) > -1);});
};

////////////////////  
// Examples  
////////////////////

[1,2,3,4,5,6].diff( [3,4,5] );  
// => [1, 2, 6]

["test1","test2","test3","test4","test5","test6"].diff(["test1","test2","test3","test4"]);  
// => ["test5", "test6"]

問題は、文字列の配列を 3 次元配列の特定のキーと比較する必要があることです。これが私がそれをどのように構造化したかです:

Array1 = [collab1: "Name, Someone's",
          collab2: "Else, Somebody",
          ...: ...],

         [collab1: "Else, Somebody",
          collab2: "Thornton, Billy Bob",
          ...: ...];

Array2 = ["Name, Someone's", "Else, Somebody", "Thornton, Billy Bob"]

diff クラスを使用して、Array2 に対する各インデックスの collab1 をチェックしたいと思います。これは可能ですか?

4

1 に答える 1

1

任意の 2 つのオブジェクトを比較するソリューション:

var
array_tools = {};
array_tools.filter = function(Arr,fun){
    if(typeof Array.prototype.filter === 'undefined'){ // Допиливание функциональности массивов для IE
        //filter = function( fun  ){ // , thisp
          var len = Arr.length;
          if(typeof fun != "function") throw new TypeError();

          var res = [], thisp = arguments[1];

          for(var i=0;i<len;i++){
                if(i in Arr){
                  var val = Arr[i]; // in case fun mutates this
                  if(fun.call(thisp, val, i, Arr)) res.push(val);
                }
          }

          return res;

    }
    else{
        return Arr.filter(fun);
    }
};

var compare_objects = function( firstObj, secondObject ){
    var get_keys = function(O){
        var A = [];
        for(var key in O) A.push(key);
        return A;
    },
    keysFirstObj     = get_keys(firstObj),
    keysSecondObject = get_keys(secondObject);

    if( keysFirstObj.length != keysSecondObject.length ){
        return false;
    }

    return !array_tools.filter( keysFirstObj, function(key){
        if( typeof firstObj[key] == "object" || $.isArray(firstObj[key]) ){
            return !compare_objects(firstObj[key], secondObject[key]);
        }
        else{
            return firstObj[key] !== secondObject[key];
        }
    } ).length;
}

2 つのオブジェクトを比較するには: compare_objects(Obj1, Obj2). これが真である場合、それらは等しいです。


ADDITION $.isArrayは jQuery からのものです。jQuery が必要ない場合は、完全なソースを開いて、このツールのみをコピーしてください。

于 2012-07-31T14:13:29.680 に答える