Come inserire sia la chiave che il valore in un array in Jquery


89

Sto leggendo feed RSS e inserendo sia il titolo che il collegamento in un array in Jquery .

Quello che ho fatto è

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});
                });                      
            });

E sto leggendo di nuovo quell'array usando

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

Ma mi dà output come

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

come questo ...

Come posso ottenere sia il riquadro che il collegamento come coppia ( titolo come chiave e collegamento come valore )

Risposte:


190

Non ci sono chiavi negli array JavaScript. Usa gli oggetti per quello scopo.

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 );
});

In JavaScript, gli oggetti svolgono il ruolo di array associativi. Tenere presente che gli oggetti non hanno un "ordinamento" definito durante l'iterazione (vedere di seguito).

Tuttavia , nel tuo caso non mi è davvero chiaro il motivo per cui trasferisci i dati dall'oggetto originale ( data.news). Perché non semplicemente passare un riferimento a quella oggetto intorno?


Puoi combinare oggetti e array per ottenere un'iterazione prevedibile e un comportamento chiave / valore:

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

Questo codice

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

non sta facendo quello che pensi che faccia. Ciò che viene inviato è un nuovo oggetto con un singolo membro denominato "titolo" e con linkcome valore ... il titlevalore effettivo non viene utilizzato. Per salvare un oggetto con due campi devi fare qualcosa di simile

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

oppure con i recenti progressi di Javascript puoi usare la scorciatoia

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

La cosa più simile a una tupla Python sarebbe invece

arr.push([title, link]);

Una volta che avete i vostri oggetti o array nella arrmatrice è possibile ottenere i valori sia come value.titlee value.linko, nel caso della versione matrice spinto, come value[0], value[1].


19

Penso che sia necessario definire un oggetto e quindi inserire array

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

17
arr[title] = link;

Non stai spingendo nell'array, stai impostando l'elemento con la chiave titledel valore link. In quanto tale, il tuo array dovrebbe essere un oggetto.


2

Potresti voler dire questo:

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['        ']);

Puoi impostare un enumerabile per un oggetto come: ({})[0] = 'txt';e puoi impostare una chiave per un array come:([])['myKey'] = 'myVal';

Spero che sia di aiuto :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.