2014-03-14 63 views
32

我想要數組的位置也是一樣的,值也一樣。如何使用Javascript比較兩個數組是否相等?

var array1 = [4,8,9,10]; 
var array2 = [4,8,9,10]; 

我試過這樣

var array3 = array1 === array2 // returns false 
+1

http://stackoverflow.com/questions/1773069/using-jquery-to-compare -two-arrays – xdazz

+1

以上是命令無關,OP請求有序保存。 – DrLivingston

+2

我認爲這實際上是http://stackoverflow.com/questions/7837456的一個騙局。 –

回答

108

你可以使用Array.prototype.every()。(需要對IE < 9等老牌瀏覽器一個填充工具

var array1 = [4,8,9,10]; 
var array2 = [4,8,9,10]; 

var is_same = (array1.length == array2.length) && array1.every(function(element, index) { 
    return element === array2[index]; 
}); 

THE WORKING DEMO.

+2

我可以用這個嗎?它也可以正常工作。 –

+0

這個答案也在這裏找到:http://stackoverflow.com/a/19746771。並注意它只適用於淺等於(這對於OP給出的例子來說是完全正確的)。 –

+0

只有一點改進:'(array1.length === array2.length)'。 '==='而不是'=='。 – lwozniak

10
var array3 = array1 === array2 

這將比較數組1和數組2是否在內存中同一數組對象,這是不是你想要的。

爲了做到你想要的,你需要檢查兩個數組是否具有相同的長度,每個索引中的每個成員是相同的。

假設你的數組充滿了原語號碼和或字符串,這樣的事情應該做

function arraysAreIdentical(arr1, arr2){ 
    if (arr1.length !== arr2.length) return false; 
    for (var i = 0, len = arr1.length; i < len; i++){ 
     if (arr1[i] !== arr2[i]){ 
      return false; 
     } 
    } 
    return true; 
} 
+3

這裏是一個小提琴玩(相同的答案,不同的方式來迭代):http://jsfiddle.net/jimschubert/85M4z/ –

+0

多維數組版本可在這裏:http://stackoverflow.com/questions/7837456/comparing-two-arrays-in-javascript –

-1

嘗試做這樣的:array1.compare(array2)=true

Array.prototype.compare = function (array) { 
    // if the other array is a falsy value, return 
    if (!array) 
     return false; 

    // compare lengths - can save a lot of time 
    if (this.length != array.length) 
     return false; 

    for (var i = 0, l=this.length; i < l; i++) { 
     // Check if we have nested arrays 
     if (this[i] instanceof Array && array[i] instanceof Array) { 
      // recurse into the nested arrays 
      if (!this[i].compare(array[i])) 
       return false; 
     } 
     else if (this[i] != array[i]) { 
      // Warning - two different object instances will never be equal: {x:20} != {x:20} 
      return false; 
     } 
    } 
    return true; 
} 
+1

這裏的經驗法則並不是要混淆你不擁有的物體。 'Array.prototype'是一個內置的數組類型的原型對象,這會在團隊中工作時造成不一致。 –

1

如果在同一個索引比較2個數組,但值沒有,那麼試試這個

var array1=[1,2,3,4] 
var array2=[1,4,3,2] 
var is_equal = array1.length==array2.length && array1.every(function(v,i) { return ($.inArray(v,array2) != -1)}) 
console.log(is_equal) 
4

你可以試試這個簡單的方法

var array1 = [4,8,9,10]; 
 
var array2 = [4,8,9,10]; 
 

 
console.log(array1.join('|')); 
 
console.log(array2.join('|')); 
 

 
if (array1.join('|') === array2.join('|')) { 
 
\t console.log('The arrays are equal.'); 
 
} else { 
 
\t console.log('The arrays are NOT equal.'); 
 
} 
 

 
array1 = [[1,2],[3,4],[5,6],[7,8]]; 
 
array2 = [[1,2],[3,4],[5,6],[7,8]]; 
 

 
console.log(array1.join('|')); 
 
console.log(array2.join('|')); 
 

 
if (array1.join('|') === array2.join('|')) { 
 
\t console.log('The arrays are equal.'); 
 
} else { 
 
\t console.log('The arrays are NOT equal.'); 
 
}

如果值的位置不重要,可以先對數組進行排序。

if (array1.sort().join('|') === array2.sort().join('|')) { 
    console.log('The arrays are equal.'); 
} else { 
    console.log('The arrays are NOT equal.'); 
} 
+0

原來的問題表明,職位和價值必須相同。如果位置不重要,那麼你可以先對兩個數組進行排序。 –

31

不太穩健的方法,但它的工作原理。

a = [2, 4, 5].toString(); 
b = [2, 4, 5].toString(); 

console.log(a===b); 
+7

如果數組元素的順序不同,該怎麼辦?這不起作用 – fenec

+4

如果你知道數組是在相同的順序(如我),完美的作品。然而,你可以用sort()排序數組元素,然後這應該解決操作的問題。 –

+4

如果a ='[2,4,5] .toString()' 和b ='[「2,4」,5] .toString()',這種方法給出了錯誤的答案。 –

0

這是代碼。它能夠比較任何位置的數組。

var array1 = [4,8,10,9]; 

var array2 = [10,8,9,4]; 

var is_same = array1.length == array2.length && array1.every(function(element, index) { 
    //return element === array2[index]; 
    if(array2.indexOf(element)>-1){ 
    return element = array2[array2.indexOf(element)]; 
    } 
}); 
console.log(is_same); 
+0

謝謝!我正在使用這個!我很欣賞這是如何簡潔的 – williamle8300

+0

上面的代碼在很多情況下更有用。我正在使用我自己。 – Zia

2

一個更現代的版本:

function arraysEqual(a, b) { 
    a = Array.isArray(a) ? a : []; 
    b = Array.isArray(b) ? b : []; 
    return a.length === b.length && a.every((el, ix) => el === b[ix]); 
} 

強制轉換非陣列參數空數組從爆炸停止a.every()

如果你只是想看看,如果陣列具有相同的一組元素,那麼你可以使用Array.includes()

function arraysContainSame(a, b) { 
    a = Array.isArray(a) ? a : []; 
    b = Array.isArray(b) ? b : []; 
    return a.length === b.length && a.every(el => b.includes(el)); 
} 
+0

不幸的是,這給出了誤報。例如:'arraysEqual(23,「」)' –

+0

這是故意的。 *不是數組* * *不是數組* –

+0

我認爲'arrayEqual'是否應該被允許接收非數組輸入是值得商榷的。也就是說,瞭解上述「陷阱」還是很好的。 –

3

使用lodash。 在ES6語法:

import isEqual from 'lodash/isEqual'; 
let equal = isEqual([1,2], [1,2]); // true 

或以前版本的JS:

var isEqual = require('lodash/isEqual'); 
var equal = isEqual([1,2], [1,2]); // true 
0
function isEqual(a) { 
if (arrayData.length > 0) { 
    for (var i in arrayData) { 
     if (JSON.stringify(arrayData[i]) === JSON.stringify(a)) { 
      alert("Ya existe un registro con esta informacion"); 
      return false; 
     } 
    } 
} 
} 

Check this example

相關問題