Jquery'de hem anahtarı hem de değeri bir Diziye aktarma


89

RSS beslemesini okuyorum ve hem Başlık hem de Bağlantı'yı Jquery'de bir Diziye itiyorum .

Ne yaptım

var arr = [];

            $.getJSON("displayjson.php",function(data){
                $.each(data.news, function(i,news){
                    var title = news.title;
                    var link = news.link;
                    arr.push({title : link});
                });                      
            });

Ve bu diziyi tekrar okuyorum

$('#show').click(function(){
                $.each(arr, function(index, value){
                    alert( index +' : '+value);
                });
            });

Ama bana verilmesi Çıktı olarak

1:[Object Object]
2:[Object Object]
3:[Object Object]

bunun gibi ...

İ hem alabilirsiniz nasıl fayans ve bağlantı çifti olarak ( başlık değeri olarak anahtar ve bağlantı olarak )

Yanıtlar:


190

JavaScript dizilerinde anahtar yoktur. Bu amaçla nesneleri kullanın.

var obj = {};

$.getJSON("displayjson.php",function (data) {
    $.each(data.news, function (i, news) {
        obj[news.title] = news.link;
    });                      
});

// later:
$.each(obj, function (index, value) {
    alert( index + ' : ' + value );
});

JavaScript'te nesneler, ilişkilendirilebilir dizilerin rolünü yerine getirir. Nesnelerin yinelenirken tanımlanmış bir "sıralama düzeni" olmadığına dikkat edin (aşağıya bakın).

Ancak , sizin durumunuzda, orijinal nesneden ( data.news) neden veri aktardığınız bana pek açık gelmiyor . Neden etrafta o nesneye bir referans vermiyorsunuz ?


Öngörülebilir yineleme ve anahtar / değer davranışı elde etmek için nesneleri ve dizileri birleştirebilirsiniz :

var arr = [];

$.getJSON("displayjson.php",function (data) {
    $.each(data.news, function (i, news) {
        arr.push({
            title: news.title, 
            link:  news.link
        });
    });                      
});

// later:
$.each(arr, function (index, value) {
    alert( value.title + ' : ' + value.link );
});

30

Bu kod

var title = news.title;
var link = news.link;
arr.push({title : link});

sandığın şeyi yapmıyor. İtilen şey, "title" adlı tek bir üyeye sahip yeni bir nesnedir linkve değer olarak ... gerçek titledeğer kullanılmaz. İki alanlı bir nesneyi kaydetmek için aşağıdaki gibi bir şey yapmanız gerekir

arr.push({title:title, link:link});

veya son Javascript gelişmeleri ile kısayolu kullanabilirsiniz

arr.push({title, link}); // Note: comma "," and not colon ":"

Bir python demetine en yakın şey bunun yerine

arr.push([title, link]);

Daki nesneler veya diziler edindikten sonra arrdizinin siz ya değerler elde edebilirsiniz value.titleve value.linkgibi itilmiş dizi versiyonunda durumunda ya value[0], value[1].


19

Sanırım bir nesne tanımlamanız ve ardından dizi içinde itmeniz gerekiyor

var obj = {};
obj[name] = val;
ary.push(obj);

17
arr[title] = link;

Sen değilsin iterek Eğer anahtarla elemanı kuruyorsun, diziye titledeğere link. Bu nedenle, diziniz bir nesne olmalıdır.


2

Şunu kastediyor olabilirsiniz:

var unEnumeratedArray = [];
var wtfObject = {
                 key    : 'val', 
                 0      : (undefined = 'Look, I\'m defined'),
                 'new'  : 'keyword', 
                 '{!}'  : 'use bracket syntax',
                 '        ': '8 spaces'
                };

for(var key in wtfObject){
    unEnumeratedArray[key] = wtfObject[key];
}
console.log('HAS KEYS PER VALUE NOW:', unEnumeratedArray, unEnumeratedArray[0], 
             unEnumeratedArray.key, unEnumeratedArray['new'], 
             unEnumeratedArray['{!}'], unEnumeratedArray['        ']);

Bir Object için şöyle bir numaralandırılabilir: ({})[0] = 'txt';ve bir Dizi için aşağıdaki gibi bir anahtar ayarlayabilirsiniz:([])['myKey'] = 'myVal';

Bu yardımcı olur umarım :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.