2016-04-25 71 views
0
var array1 = ["display1"]; 
var array2 = ["display1", "display2", "display3"]; 

    Array.prototype.compare = function(testArr) { 
     if (this.length != testArr.length) return false; 
     for (var i = 0; i < testArr.length; i++) { 
      if (this[i].compare) { 
       if (!this[i].compare(testArr[i])) return false; 
      } 
      if (this[i] !== testArr[i]) return false; 
     } 
     return true; 
    } 

    if(!array1.compare(array2)) { 
    alert("is not match"); 
    // get all un-matched variable. 
    }else{ 
    alert("matched"); 
    } 

我的意圖是比較2個數組彼此,並獲得所有這些不匹配的變量,這個代碼全部比較看看他們是否匹配。比較2個數組,並得到那些變量不匹配

我該如何獲得所有不匹配的變量?

所以這個結果將是[「display2」,「display3」];

+1

看起來像你對我應該複製更長的一個,然後從副本中刪除較短的每個項目,只留下唯一的。 – dandavis

+0

你只需要比較簡單的數據(數字/字符串)還是對象?如果是對象,你需要比較他們的數據還是他們的參考? – RainingChain

+0

你想如何處理重複? 'var a = [1,2,3,4]; var b = [1,2,2,3,5];' –

回答

2

你可以使用一個臨時對象以計數的array1array2給定值和過濾如果值具有計數1

function xxx(a1, a2) { 
 
    var a3 = a1.concat(a2), 
 
     temp = Object.create(null); 
 

 
    a3.forEach(function (a) { 
 
     temp[a] = (temp[a] || 0) + 1; 
 
    }); 
 
    return a3.filter(function (a) { 
 
     return temp[a] === 1; 
 
    }); 
 
} 
 

 
var array1 = ["display1"], 
 
    array2 = ["display1", "display2", "display3"], 
 
    array3 = xxx(array1, array2); 
 

 
document.write('<pre>' + JSON.stringify(array3, 0, 4) + '</pre>');

ES6

function xxx(a1, a2) { 
 
    var a3 = a1.concat(a2), 
 
     temp = Object.create(null); 
 

 
    a3.forEach(a => temp[a] = (temp[a] || 0) + 1); 
 
    return a3.filter(a => temp[a] === 1); 
 
} 
 

 
var array1 = ["display1"], 
 
    array2 = ["display1", "display2", "display3"], 
 
    array3 = xxx(array1, array2); 
 

 
document.write('<pre>' + JSON.stringify(array3, 0, 4) + '</pre>');

+0

這不應該從兩個陣列中提取獨特的項目。 – nisar

+0

@nisar,我不確定,你是什麼意思。 –

+0

如果我在第一個數組中放置display10而不是display1,那麼OP應該是display10,display2,display3,display1而不是display1,display2,display3。我也不確定這個問題是什麼?如果需要從兩個數組中找到唯一的,你的sol是錯誤的,你只選擇第一個數組來比較下一個數組。 – nisar

0
var arr1 = ["display1"], 
    arr2 = ["display10", "display2", "display3"], 
    result = [], 
    check = function(array1, array2) { 
     for (var i in array2) { 
      var item = array2[i]; 
      if (array1.indexOf(item) == -1) { 
       result.push(item); 
      } 
     } 
    }; 
    check(arr1, arr2); 
    check(arr2, arr1); 
alert(result); 
+0

如果我在第一個數組中放置display10而不是display1,那麼OP應該是display10,display2,display3,display1而不是display1,display2,display3。所以這不應該從兩個數組中提取獨特的項目。 @Ouroborus – nisar

+0

好吧,現在試試這個 – AKZ

+0

不錯的嘗試....它從兩個陣列中拉出獨特的物品。 – nisar

0

這應該這樣做

Array.prototype.findDifference = function(testArr) { 
    var result = []; 

    for (var j = 0; j < this.length; j++){ 
    if(testArr.indexOf(this[j])){ 
     result.push(this[j]); 
    } 
    } 

    for (var j = 0; j < testArr.length; j++){ 
    if(this.indexOf(testArr[j])){ 
     result.push(testArr[j]); 
    } 
    } 

    return result; 
} 

var array1 = ["display1", "display10"]; 
var array2 = ["display1", "display2", "display3"]; 
var result = array1.findDifference(array2); 
console.log(result); 
0

您可以使用過濾功能,以分離出不需要的元素。

var array1 = ["display1"]; 
var array2 = ["display1", "display2", "display3"]; 

Array.prototype.compare = function(testArr) { 
    var difference = []; 
    difference = this.concat(testArr).filter(function(a){ //[1] 
    if(this.indexOf(a) === this.lastIndexOf(a)) { 
     return a; //[2] 
    } 
    }.bind(this.concat(testArr))); 
    return difference; 
} 

[1] this.concat(testArr)= [ 「display1」, 「display1」, 「顯示2」, 「display3」];因爲這是一個回調函數,它的「this」將指向全局對象,因此bind(a.concat(b));用於指定「this」爲組合數組。

0

具有箭頭功能的功能解決方案。

var arr1 = ["display1"], 
 
    arr2 = ["display1", "display2", "display3"], 
 
    res = [], 
 
    lut = {}; 
 
arr1.forEach(e => lut[e]=true); 
 
res = arr2.filter(e => lut[e] ? false : true); 
 

 
document.write('<pre>' + JSON.stringify(res, 0, 2) + '</pre>');

好確定上面的代碼解決給定的例子但是概括任務可以做

var arr1 = ["display1"], 
 
    arr2 = ["display1", "display2", "display3"], 
 
    res = [], 
 
    lut = {}; 
 
arr1.length <= arr2.length ? (arr1.forEach(e=> lut[e]=true), res = arr2.filter(e => !lut[e])) 
 
          : (arr2.forEach(e=> lut[e]=true), res = arr1.filter(e => !lut[e])); 
 

 
document.write("<pre>" + JSON.stringify(res,null,2) + "</pre>");

+0

儘管結果不是想要的,你可以替換'e => lut [e]? false:true' with'e =>!lut [e]' –

+0

@Nina Scholz你的意思是「儘管結果不是想要的」?結果當然是正確的,但是爲了概括功能,可以將較短的數組存儲在LUT中並過濾較長的數組。這是你的意思..? – Redu

+0

請閱讀我的答案下面的評論。你的回答與編輯時的回答相似。 –