2012-02-08 36 views
5

Tôi có hai mảng. Trong mỗi mảng, tôi có các đối tượng với nhiều thuộc tính nhưng không có phương thức nào. Tôi cần xem nếu mảng 1 bằng với mảng 2.So sánh các mảng đối tượng, cách tối ưu

Một cách để thực hiện điều đó là tạo một hàm truyền qua từng phần tử của mảng và so sánh từng thuộc tính của đối tượng với đối tượng trong tương tự vị trí trong mảng thứ hai.

Vấn đề là các mảng khá lớn và mỗi đối tượng có nhiều thuộc tính. Tôi đã lang thang nếu có thể có một cách khác. Trong C + + ví dụ tôi có thể đọc bộ nhớ ... nhưng tôi không biết làm thế nào để làm điều đó trong js.

Tôi cần có cách tối ưu nhất vì đây là một phần của hàm được sử dụng thường xuyên.

+0

[So sánh mảng javascript của mảng theo các giá trị riêng biệt] (http://stackoverflow.com/questions/18657232/compare-javascript-array-of-array-by-distinct-values) mã này có thể giúp bạn. – Jugal

Trả lời

4

Trừ khi chúng là cùng một thể hiện mảng, so sánh vị trí bộ nhớ sẽ không hoạt động trong JavaScript (điều gì xảy ra khi bạn thực hiện arr1 == arr2).

Bạn cần lặp lại một cách rõ ràng.

Một số người sử dụng JSON.stringify() (xem ra cho Gotcha giải thích trong các ý kiến ​​của pimvdb) trên cả hai mảng và so sánh các dây dẫn đến lừa, nhưng serialising thành một chuỗi và so sánh âm thanh trên hoàn toàn đắt đối với tôi. Tuy nhiên nó hoạt động, vì vậy nếu không có vấn đề hiệu suất, hãy đi hạt! :)

Bạn cũng có thể thử toSource().

Tôi sẽ xây dựng hàm so sánh của riêng mình so sánh vừa đủ để thỏa mãn ý tưởng của tôi về giống hệt nhau.

+0

Có vấn đề về hiệu suất :). Nếu tôi so sánh arr1 == arr2 sẽ luôn trả về false vì vị trí bộ nhớ khác nhau. Tôi cần phải so sánh bộ nhớ từ vị trí đó với phần cuối của mảng "trong điều kiện bộ nhớ" để đặt nó giống như vậy với vị trí thứ hai đến cuối. P.S. Hãy tha thứ tiếng anh của tôi. – zozo

+2

@zozo JavaScript mảng thực sự là đối tượng với một số phương pháp đặc biệt và tài sản. Chúng thường không được lưu trữ tuần tự như việc triển khai các mảng khác của các ngôn ngữ khác. – alex

+0

Bạn không thể truy cập địa chỉ bộ nhớ trực tiếp như bạn có thể trong C++. JavaScript chỉ là một giao diện câm và tất cả những gì bạn có thể làm là so sánh các đối tượng bằng cách nào đó. Tôi cũng sẽ sử dụng 'JSON.stringify'. Ngoài ra còn có 'uneval'. –

0

JQuery có một chức năng gọi là jQuery.param() mà serializes đối tượng

Bạn có thể so sánh các đối tượng hoặc các mảng của các đối tượng như vậy,

$.param(originalObj) == $.param(modifiedObj) 

Nó rất mạnh mẽ trong conjuction với jQuery.extend() mà có thể được sử dụng để sao chép đối tượng

1

Chuyển đổi mảng thành chuỗi và sau đó so sánh các chuỗi sẽ có cùng hiệu suất trung bình và kém nhất: O (n) (tuyến tính).

Nếu bạn lặp lại các thuộc tính/mảng của đối tượng và hủy bỏ lần khớp thứ nhất, hiệu suất kém nhất của bạn vẫn là O (n) nhưng hiệu suất trung bình của bạn có thể cải thiện đáng kể trừ khi đối tượng bạn so sánh thường giống nhau. Dù bằng cách nào, vì quá trình truyền tải này sẽ không bao gồm việc tạo bất kỳ đối tượng mới nào và sao chép byte xung quanh - thậm chí so sánh các đối tượng/mảng tổng hợp giống hệt nhau (trường hợp xấu nhất) nên vẫn nhanh hơn việc xâu chuỗi chúng.

Như this câu trả lời gợi ý bạn chỉ có thể sử dụng Underscore.js isEqual:

mà theo tài liệu: Thực hiện một sự so sánh sâu tối ưu giữa hai đối tượng, để xác định xem họ cần được xem xét bình đẳng

Tôi khá chắc chắn nó cũng sẽ làm việc cho các mảng.

+0

Bạn nói đúng. +1 – zozo

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