2010-07-14 24 views
12

Oluşturduğum nesneleri içeren iki JavaScript dizilim (A ve B) var. A dizisindeki tüm nesnelerin B dizisinde içerildiğini, ancak mutlaka aynı sırayla olmadığını kontrol etmek istiyorum.Javascript Arrays - Aynı içerikteki iki nesne dizisini kontrol ederek, siparişi göz ardı ederek

Bunu yapmanın en iyi yolu nedir?

Düzenleme:

Hepsi gerçek nesneler değil, ilkel, bu yüzden (belki JSON.stringify gibi bir şey kullanarak) hem içeriklerini ve yapısını karşılaştırmak gerekir.

Bunu yapmak istiyorum çünkü Test Odaklı Geliştirme öğreniyorum ve nesnelerin listelerini döndüren işlevleri test etmek istiyorum. İade edilen listelerin kendilerinde beklenen nesneler olup olmadığını test etmem gerekiyor (bu durumda sipariş önemli değil).

+2

Bunlar "true", "false", "23" veya gerçek nesneler gibi temel öğeler midir? Bunu neden yapmak istediğini açıklayabilir misin? Daha iyi bir yol olabilir. – ChaosPandion

+0

Açıklama için düzenlenmiş soru. – Chetan

+0

Neden ilk sıralamak ve sonra JSON.stringify kullanın – Xinus

cevap

2

Kullanımı: çiftleri de önemli yoksaisEqArrays(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

Bu, ChaosPandion'un çözümlerinden daha mı hızlı? – Chetan

+0

çapraz tarayıcı. Kaos değil. Henüz iyi desteklenmeyen dil özelliklerini kullanıyor. – galambalazs

+1

Bu kod çalışmıyor: 'isEqArrays ([0, 0, 1], [0, 1, 1])' döndürür 'true'. – callum

1

Bu, en yavaş olan en basit yöntemdir.

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

yalnızca aynı nesneye ait olduğunu kontrol edecektir. Değer eşdeğerliğini kontrol etmek isterseniz, özelliklerin derin bir karşılaştırmasını yapmalısınız ya da sorunuzda belirtildiği gibi JSON.stringify kullanın.

+0

'.indexOf' nesne eşdeğerini kontrol ediyor mu? Sanki bir 'o2 = {PropA: 2, PropB: 2}' yi yaparsam ve 'b' ye koyarsam, -1'den başka bir şey döndürür mü? – Chetan

+0

@Chetan - Güncellemeye bakın. – ChaosPandion

+0

Diğer yanıtta olduğu gibi, bu, [0, 1, 1] ve '[0, 0, 1]' için yanlış bir pozitif döndürür. – callum

2

, sen lodash kullanarak bir gömlekler yapabilirsiniz. İki dizinin arasındaki boşluğun boş olup olmadığına bakın.

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 
İlgili konular