Javascript与子阵列的区别

时间:2012-07-31 13:39:25

标签: javascript prototypejs

我正在开发一个程序,并希望对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。这可能吗?

1 个答案:

答案 0 :(得分: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 - 打开它的完整源代码并只复制这个工具。

相关问题