2012-02-08 17 views
5

İki dizim var. Her dizide, çok fazla özelliğe sahip ancak hiçbir yöntem içermeyen nesnelerim var. Dizi 1'in dizi 2 ile eşit olup olmadığını görmem gerekiyor.Nesnelerin dizilerini karşılaştırın, en uygun yol

Bunu yapmanın bir yolu, bir dizinin her öğesinin içinden geçen ve nesnenin her bir özelliğini, benzer bir nesne ile karşılaştıran bir işlev oluşturmaktır. ikinci dizide pozisyon.

Sorun, dizilerin oldukça büyük olmasının yanı sıra, her nesnenin de birçok özelliğe sahip olmasıdır. Başka bir yol olabilirse dolaşıyordum. C++ 'da örneğin hafızayı okuyabiliyordum ... ama bunu js'de nasıl yapacağımı bilmiyorum.

Bu, en sık kullanılan yöntemin bir parçası olduğu için en uygun şekilde elde etmem gerekiyor.

+0

[Dizinin javascript dizisini farklı değerlerle karşılaştırın] (http://stackoverflow.com/questions/18657232/compare-javascript-array-of-array-by-distinct-values) bu kod size yardımcı olabilir. – Jugal

cevap

4

Aynı dizi örneği olmadıkça, bellek konumlarını karşılaştırmak JavaScript'te çalışmaz (arr1 == arr2'u yaptığınızda ne olur).

Açıkça döngü yapmanız gerekir.

Bazı insanlar JSON.stringify() dolandırıcı iki dizide üzerinde (yakaladım pimvdb yorumlarına açıklanan dikkat) ve elde edilen dizeleri karşılaştırmak kullanır, ancak bir dizeye serialising ve bana tamamen pahalı üzerinde sesleri karşılaştırarak. Ancak çalışır, bu yüzden performans sorunu yoksa, fındık git! :)

Ayrıca toSource() deneyebilirsiniz.

özdeş eşgörünümle ilgili yeterli olanı karşılaştıran kendi karşılaştırmalı işlevimi oluşturabilirim.

+0

Performans sorunu var :). Eğer arr1 == karşılaştırırsam arr2, bellek konumu farklı olduğu için her zaman yanlış döner. Hafızayı, bu konumdan sonuna kadar ikinci konumla birleştirmek için dizinin sonuna "bellek terimleriyle" karşılaştırmalıyım. Not; Lütfen ingilizcemi affedin. – zozo

+2

@zozo JavaScript dizileri, bazı özel yöntem ve özelliklerle gerçekten nesnelerdir. Sıralı olarak diğer diller dizileri gibi sıralı olarak depolanmazlar. – alex

+0

Adresi, C++'da olduğu gibi doğrudan belleğe erişemezsiniz. JavaScript sadece aptal bir arayüzdür ve yapabileceğiniz tek şey nesneleri bir şekilde karşılaştırmaktır. Ben de JSON.stringify'ı kullanırdım. Ayrıca 'uneval' var. –

0

JQuery nesneleri

klonlamak için kullanılabilecek nesneler

Öyle gibi nesnelerin ya da nesne dizileri karşılaştırabilirsiniz serializes jQuery.param() adlı bir işlev, O jQuery.extend() ile paralel olarak çok güçlü

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

sahiptir

1

Dizilerin dizelere dönüştürülmesi ve dizelerin karşılaştırılması, aynı ortalama ve en kötü performansa sahip olacaktır: O (n) (doğrusal).

Nesnelerinizin özelliklerini/dizilerini kapatır ve 1. eşleşmeyi iptal ederseniz en kötü performansınız yine O (n) olur, ancak karşılaştırdığınız nesneler genellikle aynı değilse, ortalama performansınız önemli ölçüde artabilir. Her iki durumda da, bu geçiş, herhangi bir yeni nesne oluşturmayı ve kopyalamayı, aynı bileşik nesneleri/dizileri (en kötü durum) karşılaştırarak bile içermemeyi gerektirdiğinden, yine de bunları birleştirmekten daha hızlı olmalıdır. this cevap anlaşılacağı

olarak, sadece Underscore.js isEqual kullanabilirsiniz:

docs göre

: eşit kabul edilmelidir olmadığını belirlemek için, iki nesne arasındaki optimize edilmiş derin karşılaştırma yapar

eminim diziler için de çalışacak.

+0

Haklısınız. +1 – zozo