Soru JavaScript Çok Boyutlu Diziler [çoğalt]


Bu sorunun zaten bir cevabı var:

Bu sormak istediğim soru değildi, ancak JavaScript dizileriyle beklenmedik bir şekilde karaya oturdum. PHP arkaplanından geliyorum ve birkaç web sitesine baktıktan sonra hiç kimse bilmiyorum.

Çok boyutlu bir dizi oluşturmaya çalışıyorum.

var photos = new Array;
var a = 0;
$("#photos img").each(function(i) {
    photos[a]["url"] = this.src;
    photos[a]["caption"] = this.alt;
    photos[a]["background"] = this.css('background-color');
    a++;
});

Hata mesajı: fotoğraflar [a] tanımsız. Bunu nasıl yaparım? Teşekkürler.


26
2018-05-11 07:59


Menşei


this.css işe yaramayacak, sarmalısın this jQuery nesnesinin içinde: $(this).css. - Ionuț G. Stan
Başlık bir kopyası gösterse de, asıl istediğin kişi dizilerden değil, bir dizi nesneden oluşuyordu. - Ben Flynn


Cevaplar:


JavaScript'in çok boyutlu dizileri değil, benzer şekilde kullanılabilen diziler dizisi yoktur.

Aşağıdakileri denemek isteyebilirsiniz:

var photos = [];
var a = 0;
$("#photos img").each(function(i) {
    photos[a] = [];
    photos[a]["url"] = this.src;
    photos[a]["caption"] = this.alt;
    photos[a]["background"] = this.css('background-color');
    a++;
});

Kullanabileceğinizi unutmayın new Array() yerine []ama ikincisi genellikle tavsiye edilir. Ayrıca, parantezini kaçırdığınızı unutmayın. new Array() ilk satırda.


GÜNCELLEŞTİRME: Aşağıdaki yorumlardan sonra, yukarıdaki örnekte dizilerden oluşan diziler kullanılmasına gerek kalmamıştır. Bir dizi nesne daha uygun olurdu. Kod hala geçerlidir, çünkü diziler bu dilde nesnelerdir, ancak aşağıdakiler daha iyi olurdu:

photos[a] = {};
photos[a]["url"] = this.src;
photos[a]["caption"] = this.alt;
photos[a]["background"] = this.css('background-color');

35
2018-05-11 08:03



Bir Dizi, dizeleri değil, sayısal anahtarları tutar. - Alsciende
@Alsciende: Bu kod geçerlidir. Bir dizi, JavaScript'teki bir nesnedir ve nesneler ve hashtables, bu dilde aynı şeydir. bu nedenle photos[0]["url"] atama url mülk photos[0]. - Daniel Vassallo
Geçerli, ama uygun değil. Bu durumda bir Array kullanmanın bir anlamı yok, sadece acemi insanlar için kafa karıştırıcı. - Alsciende
Kullanmak daha iyi photos[a] = {}; - Ionuț G. Stan
haklısın doğru yol photos[a]={}; ve yok [], Çünkü var x=[]; x['foo']='bar'; alert(x.length) //0 diziyi doldurmadığını, ancak nesne özelliklerinin acctually olduğunu görebilirsiniz. - Vitim.us


Bir şey atamaya çalışıyorsun photos[a]["url"], photos[a]["caption"]vs. photos[a] henüz mevcut değil. photos ilk başta boş bir Dizi, bu yüzden ayarlamanız gerekiyor photos[a] önce bir şeye. Dize anahtarlarını kullanmak istediğinizden ("url", "caption", vb), bu bir şey düz bir nesne olmalıdır (javascript php associave dizileri eşdeğer) (veya kod tabanınız izin verirse bir Hash). Ardından, işlevinizi basitleştirmek için bir literal nesne yapısını kullanabilirsiniz. Array#push gereksizden kurtulmak a:

var photos = [];
$("#photos img").each(function(img) {
    photos.push({
      url: img.src,
      caption: img.alt,
      background: img.style.backgroundColor
    });
});

Ayrıca, emin olun this aslında senin img öğesi. Bazı each uygulamalar belirlenecek this Davanızdaki genel nesneye.

düzenleme: Tamam, benziyor jQuery.each otomatik olarak ayarlar this yinelenen öğeye, ama jQuery-goodness içinde sarmıyor, bu yüzden ya sarmak gerekir this içinde $() veya düz DOM kullan (örneğimde bunu kullanmıştım).

edit2: yine de, kullanarak this geri çağrı fonksiyonu geçtiğinden beri garip each bir argüman alır. Bu argümanı da kullanabilir (yeniden adlandırılabilir).


16
2018-05-11 08:56



Tek sorun this sahip değil mi css yöntem. Önce bir jQuery nesnesine sarılmalıdır. - Ionuț G. Stan
JQuery hakkında fazla bir şey yok. Tavsiyeni kullanacağım. - Alsciende


var photos = [];
var imgs = document.getElementById("photos").getElementsByTagName("img");
for(var i=0;i<imgs.length;i++){
    photos.push({
        src:imgs[i].src,
        alt:imgs[i].alt,
        background:imgs[i].style.backgroundColor
    });
}

Bu size PHP'de kabaca buna eşdeğer bir şey vermelidir (bende taklit veri oluşturdum):

Array(
    [0] => Array(
        "src" => "logo.png",
        "alt" => "My Logo!",
        "background" => "#ffffff"
    )
)

Umarım bu yardımcı olur!


5
2018-05-11 08:09



Mümkün olduğunda düz js kodlama için +1 - Alsciende
bunu daha okunaklı hale getirdiğiniz için teşekkürler. - tau


Bu konuyu okurken çok boyutlu ilişkisel dizileri anlamaya çalışıyordum. Açık değildi, bu yüzden araştırmaya devam ettim, bu benim ortaya çıktığım şey:

var images = new Array;
images['logo'] = { 'src': 'http://example.com/image1.png', 'caption': 'this is the logo', 'background':  '#000'};
images['background'] = { 'src': 'http://example.com/image2.png', 'caption': 'this is the background', 'background':  '#FFF'};
alert(images['logo']['src']); /* output: http://example.com/image1.png */
alert(images['background']['caption']); /* output: this is the background */

Bu yardımcı olur umarım!


2
2018-06-29 12:48





Çok boyutlu diziler bu yapıdadır:

var photos = new Array();
photos[0] = new Array();

onu kullan:

photos[0][0] = this.src;

JS dizisinde daha fazlası İşte.


0
2018-05-11 08:05





Douglas Crockford, JSLint, bu şekilde yaratırdınız ("Dizi literal notasyonunu kullanın []"):

var photos = [];

Şimdi, bir dizinin içinde bir dizi anlamına gelen çok boyutlu diziler oluşturmak istediğinizi unutmayın. Bu, iç dizileri oluşturmanız gerektiği anlamına gelir:

$("#photos img").each(function(i) {
  photos[a] = []
  //continue

0
2018-05-11 08:06