2012-02-08 17 views
5

Mam dwie tablice. W każdej tablicy mam obiekty z dużą ilością właściwości, ale bez metod. Muszę sprawdzić, czy tablica 1 jest równa tablicy 2.Porównaj tablice obiektów, optymalny sposób

Jednym ze sposobów, aby to zrobić, jest utworzenie funkcji przechodzącej przez każdy element tablicy i porównywanie każdej właściwości obiektu z obiektem w podobnym pozycja w drugiej tablicy.

Problem polega na tym, że tablice są dość duże, a także każdy obiekt ma wiele właściwości. Błądziłem, czy może być inny sposób. W C++ na przykład mogłem czytać pamięć ... ale nie wiem jak to zrobić w js.

Potrzebuję uzyskać najbardziej optymalny sposób, ponieważ jest to część funkcji, która jest często używana.

+0

[Porównaj tablicę javascript w tablicy według różnych wartości] (http://stackoverflow.com/questions/18657232/compare-javascript-array-of-array-by-distinct-values) ten kod może ci pomóc. – Jugal

Odpowiedz

4

O ile nie są to te same instancje tablicowe, porównywanie lokalizacji pamięci nie działa w języku JavaScript (co się dzieje, gdy wykonuje się arr1 == arr2).

Konieczne jest jawne zapętlenie.

Niektórzy używają JSON.stringify() (uważaj na haczyka wyjaśnił w komentarzach przez pimvdb) na obu tablicach i porównać wynikające struny do oszukać, ale SZEREGOWANIE na sznurku i porównywania dźwięków na całkowicie drogie dla mnie. Jednak działa, więc jeśli nie ma problemu z wydajnością, odejdź! :)

Możesz również spróbować toSource().

Chciałbym zbudować własną funkcję porównawczą, która porównuje tylko tyle, że spełnia mój pomysł identyczne.

+0

Wystąpił problem z wydajnością :). Jeśli porównasz arr1 ==, arr2 zawsze zwróci false, ponieważ lokalizacja pamięci jest inna. Muszę porównać pamięć z tej lokalizacji z końcem tablicy "w kategoriach pamięci", aby umieścić ją w ten sposób z drugą lokalizacją do końca. P.S. Proszę wybaczyć mój angielski. – zozo

+2

@zozo Tablice JavaScript są naprawdę obiektami z pewnymi specjalnymi metodami i właściwościami. Zazwyczaj nie są one przechowywane sekwencyjnie, podobnie jak w innych językach implementacje tablic. – alex

+0

Nie możesz uzyskać dostępu do pamięci bezpośrednio, jak to możliwe w C++. JavaScript jest po prostu głupim interfejsem, a wszystko, co możesz zrobić, to jakoś porównać obiekty. Również użyłbym 'JSON.stringify'. Istnieje również "nierównomierny". –

0

JQuery posiada funkcję o nazwie jQuery.param() który serializes obiektów

można porównać obiekty lub tablice obiektów jak tak,

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

To bardzo mocny w połączeniu z jQuery.extend() który może być używany do klonować obiekty

1

Konwersja tablic na ciągi, a następnie porównywanie łańcuchów będzie mieć tę samą średnią i najgorszą wydajność: O (n) (liniowy).

Jeśli przełączysz się przez właściwości/tablice obiektów i przerwiesz na pierwszym niedopasowaniu, najgorszą wydajnością będzie nadal O (n), ale średnia wydajność może znacznie poprawić, chyba że obiekty, które porównujesz, są zazwyczaj identyczne. Tak czy inaczej, ponieważ to przejście nie obejmowałoby tworzenia jakichkolwiek nowych obiektów i kopiowania bajtów wokół - nawet porównywanie identycznych obiektów złożonych/tablic (najgorszy przypadek) powinno nadal być szybsze niż ich łańcuchowanie.

Jak this odpowiedź sugeruje, można po prostu użyć Underscore.js isEqual:

które zgodnie z docs: Wykonuje zoptymalizowaną głębokie porównania między dwoma obiektami, w celu ustalenia, czy należy je uznać za równy

jestem całkiem pewny będzie działać również dla tablic.

+0

Masz rację. +1 – zozo

Powiązane problemy