2012-06-07 47 views
52

Cách nhanh nhất/tốt nhất để so sánh hai mảng và trả về sự khác biệt là gì? Giống như array_diff trong PHP. Có một chức năng dễ dàng hay tôi sẽ phải tạo một chức năng qua each()? hoặc một vòng lặp foreach?So sánh 2 mảng trả về sự khác biệt

+0

Hiya người đàn ông, tôi nghĩ bạn có thể sử dụng 'inArray' và cư trú sự khác biệt giữa 2 mảng; Tôi đã dán một bản demo làm việc cho bạn, hy vọng nó sẽ giúp B-) –

+0

trùng lặp của http://stackoverflow.com/questions/1187518/javascript-array-difference (ngay cả khi nó đã được liên kết ở nơi khác trong đó, một nơi nào đó) – cregox

+0

Bạn có lẽ muốn [câu trả lời này từ một câu hỏi SO quá khứ] (http://stackoverflow.com/a/4026828/304588). Nó được xây dựng trên nguyên mẫu Array. –

Trả lời

60

Làm việc bản demohttp://jsfiddle.net/u9xES/

Tốt liên kết (Jquery Documentation): http://docs.jquery.com/Main_Page {bạn có thể tìm kiếm hoặc đọc API here}

Hy vọng điều này sẽ giúp bạn nếu bạn đang tìm kiếm để làm điều đó trong JQuery.

Cảnh báo cuối cùng sẽ nhắc mảng phần tử không phổ biến Array tức là sự khác biệt giữa 2 mảng.

Xin vui lòng cho tôi biết nếu tôi bỏ lỡ bất cứ điều gì, chúc mừng!

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

jQuery.grep(array2, function(el) { 
     if (jQuery.inArray(el, array1) == -1) difference.push(el); 
}); 

alert(" the difference is " + difference);​ // Changed variable name 
+8

Phương pháp này rất tuyệt, nhưng nên xem xét trường hợp nếu độ dài của mảng2 nhỏ hơn array1 –

+14

Thanh lịch hơn: đơn giản là 'khác biệt = $ .grep (a1, hàm (x) {return $ .inArray (x, a2) <0}) ' –

+2

Câu trả lời hay. Tuy nhiên, bạn muốn chỉ ra rằng bạn đang sử dụng '.grep' như' .each'; nên là 'khác biệt = $ .grep (mảng2, hàm (el) {return $ .inArray (el, mảng1) == -1;})' – PeterKA

1

Các hoạt động mảng như thế này không phải là điểm mạnh nhất của jQuery. Bạn nên xem xét một thư viện như Underscorejs, đặc biệt là chức năng khác biệt.

3
var arrayDiff = function (firstArr, secondArr) { 
    var i, o = [], fLen = firstArr.length, sLen = secondArr.length, len; 


    if (fLen > sLen) { 
     len = sLen; 
    } else if (fLen < sLen) { 
     len = fLen; 
    } else { 
     len = sLen; 
    } 
    for (i=0; i < len; i++) { 
     if (firstArr[i] !== secondArr[i]) { 
      o.push({idx: i, elem1: firstArr[i], elem2: secondArr[i]}); //idx: array index 
     } 
    } 

    if (fLen > sLen) { // first > second 
     for (i=sLen; i< fLen; i++) { 
      o.push({idx: i, 0: firstArr[i], 1: undefined}); 
     } 
    } else if (fLen < sLen) { 
     for (i=fLen; i< sLen; i++) { 
      o.push({idx: i, 0: undefined, 1: secondArr[i]}); 
     } 
    }  

    return o; 
}; 
127

Tôi biết đây là một câu hỏi cũ, nhưng tôi nghĩ tôi sẽ chia sẻ mẹo nhỏ này.

var diff = $(old_array).not(new_array).get(); 

diff bây giờ chứa những gì đã ở old_array đó không phải là trong new_array

+2

ngắn và ngọt .. giống như tôi thích nó .. tôi đã sử dụng nó với '$ .merge()' để nối các khác biệt theo thứ tự cụ thể ... – kingkode

+1

sẽ hoạt động nếu mảng chứa các đối tượng? Tôi đang cố gắng so sánh các đối tượng trong hai mảng – Batman

+2

Đây là một kịch bản. Điều này làm việc tốt cho '$ (['h', 'h', 'h', 'h', 'h']). Không ($ ([" a "," a "," a "]))' nhưng đối với một mảng như '$ (['h', 'h', 'h', 'h', 'h']) chứ không phải ($ ([" a "," a "," a "," h "]))' (CHÚ Ý "h" cuối cùng trong mảng) nó trả về một mảng trống. Sự khác biệt không được trả lại. Do đó, nó bị lỗi. –

2

nếu bạn cũng muốn so sánh trình tự của câu trả lời, bạn có thể mở rộng câu trả lời cho một cái gì đó như thế này:

Array.prototype.compareTo = function (array2){ 
    var array1 = this; 
    var difference = []; 
    $.grep(array2, function(el) { 
     if ($.inArray(el, array1) == -1) difference.push(el); 
    }); 
    if(difference.length === 0){ 
     var $i = 0; 
     while($i < array1.length){ 
      if(array1[$i] !== array2[$i]){ 
       return false; 
      } 
      $i++; 
     } 
     return true; 
    } 
    return false; 
} 
2

Bằng cách này bạn không cần phải lo lắng về việc nếu mảng đầu tiên nhỏ hơn mảng thứ hai.

var arr1 = [1, 2, 3, 4, 5, 6,10], 
    arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

function array_diff(array1, array2){ 
    var difference = $.grep(array1, function(el) { return $.inArray(el,array2) < 0}); 
    return difference.concat($.grep(array2, function(el) { return $.inArray(el,array1) < 0}));; 
} 

console.log(array_diff(arr1, arr2)); 
8

sử dụng nhấn mạnh như:

_.difference(array1,array2) 
+1

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. – AlSki

+2

@AlSki nó đưa ra câu trả lời cho câu hỏi được hỏi! so sánh hai mảng và trả về diff. –

+1

@ anurag_29 Câu hỏi là làm thế nào để làm điều đó với jQuery, không gạch dưới. – reergymerej

2
/** SUBTRACT ARRAYS **/ 
function subtractarrays(array1, array2){ 
    var difference = []; 
    for(var i = 0; i < array1.length; i++) { 
     if($.inArray(array1[i], array2) == -1) { 
        difference.push(array1[i]); 
     } 
    } 

    return difference; 
} 

Sau đó, bạn có thể gọi hàm bất cứ nơi nào trong mã của bạn.

var I_like = ["love", "sex", "food"]; 
var she_likes = ["love", "food"]; 

alert("what I like and she does't like is: " + subtractarrays(I_like, she_likes)); //returns "Naughty"! 

Điều này hoạt động trong mọi trường hợp và tránh các sự cố trong các phương pháp nêu trên. Hy vọng rằng sẽ giúp!

0

Điều này sẽ hoạt động với các mảng chưa được phân loại, giá trị kép và các đơn đặt hàng và độ dài khác nhau, trong khi cung cấp cho bạn các giá trị được lọc dạng array1, array2 hoặc cả hai.

function arrayDiff(arr1, arr2) { 
    var diff = {}; 

    diff.arr1 = arr1.filter(function(value) { 
     if (arr2.indexOf(value) === -1) { 
      return value; 
     } 
    }); 

    diff.arr2 = arr2.filter(function(value) { 
     if (arr1.indexOf(value) === -1) { 
      return value; 
     } 
    }); 

    diff.concat = diff.arr1.concat(diff.arr2); 

    return diff; 
}; 

var firstArray = [1,2,3,4]; 
var secondArray = [4,6,1,4]; 

console.log(arrayDiff(firstArray, secondArray)); 
console.log(arrayDiff(firstArray, secondArray).arr1); 
// => [ 2, 3 ] 
console.log(arrayDiff(firstArray, secondArray).concat); 
// => [ 2, 3, 6 ] 
0

Thay vì kéo toàn bộ Lodash bạn có thể sử dụng thành phần nguồn mở nhẹ array-diff.

Ví dụ:

diff([1,2,3], [1,2,3,4,5]) // => [4,5] 

Nó hoạt động bằng cách concating hai mảng trôi qua và lọc bao gồm Vals, trả lại một mảng đại diện cho phần chênh lệch giữa hai mảng.

Các vấn đề liên quan