2010-07-07 18 views
9

Sorun ne diyor? ...DOM'a benzer şekilde çok boyutlu dizileri sorgulamak için herhangi bir jquery özelliği var mı?

jQuery, çok boyutlu bir nesne dizisini DOM ile olduğu gibi benzer bir biçimde sorgulamanıza izin verecek herhangi bir yönteme sahiptir.

Yani örneğin, bana biraz eşleştirme özellik değerini bulunduğu çok boyutlu bir dizi içinde bulunan nesnelerin listesini almak - örneğin nerede Belirtilen tarihten daha StartOfPeriod büyük veya nerede isim == "Ben Alabaster"

ben Orada zaten bir şey varsa, tekerleği yeniden icat etmekten kaçınmayı isterim.

+6

+1 ilginç bir soru – alex

+0

Peki bu nasıl görünüyorsun? $ (obj) .find ("* [StartOfPeriod = 'Ben Alabaster']"); '? –

+0

@Dan Heberden - Sanırım özellikle sanırım herhangi bir şekilde bakmayı düşünmemiştim, ama önerdiğin sözdizimi yeterince iyi olurdu. – BenAlabaster

cevap

6

Seçici sözdizimini kullanamazsınız, ancak jQuery bunun için yararlı olabilecek $.grep ve $.inArray ile birlikte gelir. grep, bir yüklemeyle eşleşen yeni bir dizi öğe döndürür. inArray, ilk eşleşen öğenin veya -1 öğesinin dizinini döndürür. Örneğin:

var matches = $.grep(array, function(el){ 
    return el.StartOfPeriod > 2000; 
}); 

Bu Array.filter (grep için simimlar) ve Array.indexOf (inArray benzer) standart ECMAScript yöntemler, benzer; jQuery, mevcut olduğunda Array.indexOf'u kullanır. Array.every (eşleşen tüm öğeler) ve Array.some (en az bir eşleşme) gibi başka yararlı ECMAScript yöntemleri de vardır. MDC, projenize ekleyebileceğiniz bir koda sahiptir; bu nedenle, yerel uygulamalara sahip olmayan tarayıcılarda çalışır.

+0

Bu, tek boyutlu dizilerde güzel çalışır ve bunu zaten düşündüm ve bunu eklentinin temeli olarak kullanabilirdim, ancak çok boyutlu dizileri ele alan halihazırda var olan bir şey var mı diye merak ettim - örneğin 2D, 3D – BenAlabaster

2

jQuery çekirdeğinde bulunmayan bir eklenti bulabilirsiniz. Birkaç yardımcı dizi yöntemi vardır: each, unique, inArray. Kombinasyon halinde, ihtiyaçlarınızı karşılamak için özel bir şey oluşturabilirsiniz.

Aradığın şey, xpath gibi traversal içeren bir dizi kitaplıktır. Prototip çok daha büyük dizi yöntemleri vardır. Ama yine de muhtemelen ihtiyaçlarınızı tam olarak karşılayamazsınız.

alex ile katılıyorum, böyle bir kitaplık/uzantı ilginç olacaktır.

+0

Söz konusu uzantıyı yazmayı düşünüyorum ama gereksiz yere tekerleği yeniden icat etmek istemiyorum. – BenAlabaster

+1

Bu kesinlikle harika bir eklenti olurdu. * Snicker * boş zamanımda yazmaya başlayabilirim. –

+1

@Ryan Kinal: Müşterilerinizden birine ihtiyaç duyacağınız bir mazeret bul;) Sadece sözdizimi sözdiziminin neye benzemesini istediğimi anlamaya çalışıyorum, muhtemelen sadece düzenli sözdizimi gibi. Bir şeyi kodlamak kadar uzağa giderseniz, belki birbirimizden bazı fikirleri zıplatabiliriz. – BenAlabaster

1

Sadece bu yazdım .. Ben düzgün çalıştığını düşünüyorum ama kesinlikle

function findMatchingObjects(obj, member, value){ 
    var final = new Array(); 
    var temp = new Array(); 
    for(var p in obj){ 
    if (typeof obj[p] == 'object') { 
    temp = findMatchingObjects(obj[p], member, value); 
    if (temp.length == 1) 
     final.push(temp[0]); 
    } 
    if (p == member && obj[p] == value) { 
    final.push(obj); 
    } 
    } 
    alert(final.length); 
    return final; 
} 

şöyle kullanın :)

temizledik alabilir:

var moo ={baz: 1, boo: 2, bar:{c1: 3, c2: 4, c3:{t:true, f:false, baz:1}},d: 11}; 
var foo = findMatchingObjects(moo, "baz", 1); 

// did it work? 
console.log(foo); 

nesnenin bir dizi döndürür (veya Üye değer çiftiyle eşleşen alt nesnesi). Bu durumda, her iki nesne de bir baz = 1 çifti içerdiğinden, foo hem moo hem de c3 içerir.

İşlev bir jQuery seçici gibi görünmek ve hissetmek sadece sözdizimsel bir şeker meselesidir.

+0

Bende çok benzer bir şey var, ben sadece modifiye etmeye çalışıyorum, böylece jQuery'ye seçici sözdizimi ile bağlayabiliyorum. Önceden bir jQuery eklentisi yazmamıştım, o yüzden kafamı bunun etrafına sarmaya çalışıyorum. – BenAlabaster

İlgili konular