2015-02-25 23 views
5

Tôi có hai mảng javascript và tôi cần so sánh chúng. Ví dụ, giả sử tôi có hai mảng này:So sánh các thành phần của hai mảng

var array1 = ["1", "2", "3", "4"]; 
var array2 = ["4", "1", "3", "2"]; 

Những mảng đều bình đẳng trên thực tế và tôi muốn để có được true như là kết quả so sánh. Cách tốt nhất và nhanh nhất để làm điều đó là gì?

+1

Mảng của bạn có thể có cùng giá trị lặp lại? – Vaibhav

+0

Có, có thể chúng có giá trị lặp lại. – hamed

+1

Tôi xin chân thành hy vọng rằng các downvotes dưới đây không đến từ bạn, OP. – Passerby

Trả lời

2

Cách tốt nhất và cách nhanh nhất để làm điều này là sử dụng đối tượng theo dõi giá trị và số lượng của nó. Sau đó, chúng ta có thể thấy nếu nó tồn tại trong mảng thứ hai. Hãy thử điều này

function compare(arr1, arr2){ 
    var obj={}, len = arr1.length, i=0, isSame=true, prop; 
    if(arr1.length === arr2.length){ 
     for(;i<len;i++){ 
      if(obj[arr1[i]]){ 
       obj[arr1[i]] = obj[arr1[i]]+1; 
      } else{ 
       obj[arr1[i]] =1; 
      } 
     } 
     i=0, len = arr2.length; 
     for(;i<len;i++){ 
      if(obj[arr2[i]]){ 
       obj[arr2[i]] = obj[arr2[i]]-1; 
      } else{ 
       isSame = false; 
       break; 
      } 
     } 
     for (prop in obj){ 
      if(obj[prop] > 0){ 
       isSame = false; 
       break; 
      } 
     } 
    }else{ 
     isSame = false; 
    } 
    return isSame; 

} 
+0

Tôi có thể biết lý do giảm giá không? – Vaibhav

2

gì bạn thực sự có hai bộ, không mảng, nhưng tiếc là JavaScript không cung cấp bất kỳ loại "thiết lập" datatype. Cách dễ nhất để thực hiện loại kiểm tra này là sử dụng một số loại thư viện JavaScript chức năng, chẳng hạn như lodash.

Sử dụng lodash's _.union function làm cho việc này trở nên dễ dàng.

function setsEqual(a, b) { 
    var u = _.union(a, b); 
    return u.length === a.length && u.length === b.length; 
} 

Nếu bạn muốn làm điều này mà không cần thư viện bên ngoài, bạn có thể làm như vậy bằng Array.prototype.every.

function setsEqual(a, b) { 
    return a.length === b.length 
     && a.every(function (v) { return b.indexOf(v) !== -1; }); 
} 
1

Hãy thử loại bỏ các yếu tố phù hợp cho đến khi cả hai yếu tố này là rỗng:

var array1 = ["1", "2", "3", "4", "1", "5"]; 
var array2 = ["1", "5", "2", "3", "4", "1"]; 
var isSame = false; 
if(array1.length != array2.length) 
    isSame = false; 
else 
{ 
    for(var i = 0; i < array1.length; i ++) 
    { 
     var removed = false; 
     for(var j = 0; j < array2.length; j ++) 
     { 
      if(array2[j] == array1[i]) 
      { 
       // remove from array2 
       array1.splice(i, 1); 
       // remove from array1 
       array2.splice(j, 1); 
       // go back 1 for i 
       removed = true; 
       i --; 
       break; 
      } 
     } 
     if(!removed) 
      break; 
} 

    if(array1.length == 0 && array2.length == 0) 
     isSame = true; 
} 
+0

Câu trả lời của Vaibhav hiệu quả hơn, tuy nhiên không thể nâng cấp. –

0

Tôi không cho rằng đó là một cách tiếp cận nhanh nhất nhưng nó có thể hữu ích cho một mảng nhỏ với nguyên thủy

function compareArrays(a, b) { 
    var copyA = a.slice(), 
     copyB = b.slice(); 

    if (a.length !== b.length) { return false; } 
    return copyA.sort().toString() === copyB.sort().toString(); 

}