2012-07-31 64 views
0

我正在研究一個程序,並希望對Javascript有所不同。在我的程序,我有一個黑名單數組,它包含不允許使用的是在我的最終結果,如下面的值:JavaScript與子陣列的區別

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

我發現了一個巨大的尖端從另一個堆棧問題(如下所示的代碼)。

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。這可能嗎?

+0

你只需要比較它們或獲得差異? – Rustam 2012-07-31 13:47:01

+0

「Array1」後面的語法無效。它看起來像一個對象字面值,但是你將它包裝在'[]'而不是'{}'中,這使得它無效。 – 2012-07-31 13:48:18

+0

array1和array2不是數組,它們是對象......你必須迭代它們,'for(var array1中的var鍵)...' – 2012-07-31 13:48:32

回答

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; 
} 

比較兩個對象:compare_objects(Obj1, Obj2)。如果這是真的 - 他們是平等的。


加成 $.isArray是jQuery的。如果你不需要jQuery - 打開它的完整源代碼,只複製這個工具。

+0

謝謝!我會玩這個,看看我能不能爲我工作。另外,我真的很感激你真的給了我一個解決方案,而不是轟炸我錯誤地調用我有一個三維數組。 (我知道它有所作爲,但對於這個問題的參數來說這不是什麼大問題)。 – 1080p 2012-07-31 14:18:23