2010-08-08 71 views
8

Giả sử chúng ta có:So sánh hai mảng trong Javascript - Trở khác biệt

array1 = ['A', 'B', 'C', 'D', 'E']; array2 = ['C', 'E']; 

Có một chứng minh và giải pháp nhanh chóng để so sánh hai mảng với nhau, trở về một mảng mà không có giá trị xuất hiện trong cả hai mảng (C và E ở đây). Vì vậy:

array3 = ['A', 'B', 'D'] 

phải là đầu ra của giải pháp. (jquery có thể được tham gia)

thx.

+0

Are các mảng cả luôn được sắp xếp, như trong ví dụ của bạn? Nếu vậy, điều này có thể được thực hiện trong thời gian tuyến tính bằng cách chỉ cần đi bộ các mảng. –

Trả lời

11

Đây là sự khác biệt được đặt. Triển khai đơn giản là:

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

Đây là O (m * n), nơi đó là kích thước của mảng. Bạn có thể làm điều đó trong O (m + n), nhưng bạn cần phải sử dụng một số loại bộ băm. Bạn có thể sử dụng một đối tượng JavaScript như một bộ băm đơn giản cho các chuỗi. Đối với các mảng tương đối nhỏ, điều trên phải ổn.

+0

thx, đây là một giải pháp ngắn gọn. – Hans

+0

Hãy xem xét cập nhật câu trả lời này để sử dụng Array.prototype.filter thay vì jQuery.grep vì nó sẽ cung cấp giải pháp ngay cả khi jQuery không được phép. –

+0

[Array.prototype.filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) thực sự là một lựa chọn không có thư viện. Tuy nhiên, bạn cũng cần [Array.prototype.indexOf] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) (thay vì inArray). Tuy nhiên, cả hai yêu cầu tải một polyfill (được cung cấp tại các liên kết) trong các trình duyệt cũ hơn để đạt được khả năng tương thích rộng. Kể từ khi câu hỏi được phép jQuery, tôi đã đi với điều đó vì nó có polyfill riêng của mình. –

0

giải pháp nhanh đã được chứng minh mà tôi biết là tìm kiếm nhị phân mà bạn có thể sử dụng sau khi bạn sắp xếp một trong các mảng. vì vậy giải pháp cần có thời gian phụ thuộc vào thuật toán sắp xếp. nhưng ít nhất là log (N).

13

Tôi chấp nhận Giải pháp Matthews, nhưng không muốn bỏ qua một giải pháp nhanh hơn khác mà tôi vừa tìm thấy.

var list1 = [1, 2, 3, 4, 5, 6]; 
var list2 = ['a', 'b', 'c', 3, 'd', 'e']; 
var lookup = {}; 

for (var j in list2) { 
     lookup[list2[j]] = list2[j]; 
    } 

    for (var i in list1) { 
     if (typeof lookup[list1[i]] != 'undefined') { 
      alert('found ' + list1[i] + ' in both lists'); 
      break; 
} 
} 

Nguồn: Optimize Loops to Compare Two Arrays

+1

Điều này đã giúp tôi rất nhiều - cảm ơn bạn đã đăng bài. – cantera

+0

Đặc biệt tốt nếu một trong các danh sách (ở đây list2) cần phải được so sánh với nhiều ứng cử viên (nhiều list1). – JPM

+1

trên Chrome, tham chiếu nguồn được liên kết được phát hiện có chứa phần mềm độc hại – superjos

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