2010-07-14 8 views
12

Tôi có hai mảng JavaScript (AB) chứa các đối tượng mà tôi đã tạo. Tôi muốn kiểm tra rằng tất cả các đối tượng trong mảng A được chứa trong mảng B, nhưng không nhất thiết phải theo cùng một thứ tự.Mảng JavaScript - Kiểm tra hai mảng đối tượng cho cùng một nội dung, bỏ qua thứ tự

Cách tốt nhất để làm điều này là gì?

Edit:

Họ đều là những đối tượng thực tế, chứ không phải nguyên thủy, vì vậy tôi sẽ cần phải so sánh nội dung và cấu trúc của chúng cũng (có thể sử dụng một cái gì đó giống như JSON.stringify).

Tôi muốn thực hiện điều này vì tôi đang học Phát triển theo hướng thử nghiệm và tôi muốn thử nghiệm các hàm trả về danh sách đối tượng. Tôi cần phải kiểm tra xem các danh sách trả về có các đối tượng mong đợi trong chúng hay không (thứ tự không quan trọng trong trường hợp này).

+2

Chúng nguyên thủy như 'true',' false', '23' hoặc các đối tượng thực? Ngoài ra, bạn có thể giải thích lý do tại sao bạn muốn làm điều này? Có thể có một cách tốt hơn. – ChaosPandion

+0

Câu hỏi đã chỉnh sửa để làm rõ. – Chetan

+0

Tại sao không phải đầu tiên sắp xếp và sau đó sử dụng JSON.stringify để so sánh – Xinus

Trả lời

2

Cách sử dụng:isEqArrays(arr1, arr2)

// 
// Array comparsion 
// 

function inArray(array, el) { 
    for (var i = array.length; i--;) { 
    if (array[i] === el) return true; 
    } 
    return false; 
} 

function isEqArrays(arr1, arr2) { 
    if (arr1.length !== arr2.length) { 
    return false; 
    } 
    for (var i = arr1.length; i--;) { 
    if (!inArray(arr2, arr1[i])) { 
     return false; 
    } 
    } 
    return true; 
} 
+0

Điều này có nhanh hơn giải pháp của @ ChaosPandion không? – Chetan

+0

đó là trình duyệt chéo. Chaos thì không. Anh ấy sử dụng các tính năng ngôn ngữ chưa được hỗ trợ tốt. – galambalazs

+1

Mã này không hoạt động: 'isEqArrays ([0, 0, 1], [0, 1, 1])' trả về 'true'. – callum

1

Đây có lẽ là phương pháp đơn giản nhất nếu không phải là chậm nhất.

var o = { PropA: 1, PropB: 2 }; 
var a = [1, 2, 3, 4, o]; 
var b = [2, 3, 4, 1]; 

var c = a.filter(function(value, index, obj) { 
    return b.indexOf(value) > -1; 
}); 

if (c.length !== a.length) { 
    throw new Error("Array b is missing some elements!"); 
} 

indexOf sẽ chỉ kiểm tra xem chúng có cùng một đối tượng hay không. Nếu bạn muốn kiểm tra giá trị tương đương, bạn sẽ phải so sánh sâu các thuộc tính hoặc sử dụng JSON.stringify khi bạn đề cập đến trong câu hỏi của mình.

+0

Kiểm tra '.indexOf' có tương đương với đối tượng không? Như trong, nếu tôi tạo một 'o2 = {PropA: 2, PropB: 2}' và đặt nó vào 'b', nó sẽ trả về một cái gì đó khác với' -1'? – Chetan

+0

@Chetan - Xem cập nhật. – ChaosPandion

+0

Như với câu trả lời khác, điều này trả về một giá trị dương tính giả cho '[0, 1, 1]' và '[0, 0, 1]'. – callum

2

Nếu các bản sao cũng không thành vấn đề, bạn có thể làm cho một lớp lót bằng lodash. Hãy xem liệu sự khác biệt giữa hai mảng có trống không.

if (_(array_1).difference(array_2).isEmpty()) { 
    // is equal ignoring order and duplicates 
} 

console.log(_([1,2,3]).difference([2,3,1]).isEmpty()) // -> true 
console.log(_([1,2,3,3]).difference([2,3,1,1]).isEmpty()) // -> also true