So drücken Sie sowohl Schlüssel als auch Wert in ein Array in Jquery

87

Ich lese RSS-Feeds und schiebe sowohl Titel als auch Link in ein Array in Jquery .

Was ich getan habe ist

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

Und ich lese dieses Array wieder mit

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

Aber es gibt mir Output als

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

so was ...

Wie ich sowohl Kachel als auch Link als Paar erhalten kann ( Titel als Schlüssel und Link als Wert )

KillerFish
quelle

Antworten:

181

In JavaScript-Arrays sind keine Schlüssel vorhanden. Verwenden Sie zu diesem Zweck Objekte.

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 erfüllen Objekte die Rolle assoziativer Arrays. Beachten Sie, dass Objekte beim Iterieren keine definierte "Sortierreihenfolge" haben (siehe unten).

Jedoch , In Ihrem Fall ist es nicht wirklich mir klar , warum Sie Daten aus dem ursprünglichen Objekt (übertragen data.news) überhaupt. Warum geben Sie nicht einfach einen Verweis auf dieses Objekt weiter?


Sie können Objekte und Arrays kombinieren, um eine vorhersagbare Iteration und ein Schlüssel- / Wertverhalten zu erzielen :

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 );
});
Tomalak
quelle
30

Dieser Code

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

tut nicht das, was du denkst. Was gepusht wird, ist ein neues Objekt mit einem einzelnen Mitglied namens "title" und mit linkals Wert ... wird der tatsächliche titleWert nicht verwendet. Um ein Objekt mit zwei Feldern zu speichern, müssen Sie so etwas tun

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

oder mit den neuesten Javascript-Fortschritten können Sie die Verknüpfung verwenden

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

Das, was einem Python-Tupel am nächsten kommt, wäre stattdessen

arr.push([title, link]);

Sobald Sie Ihre Objekte oder Arrays in dem haben arrArray können Sie die Werte entweder als erhalten value.titleund value.linkoder, im Falle der gedrückten Array - Version, so value[0], value[1].

6502
quelle
17
arr[title] = link;

Sie drängen nicht in das Array, sondern setzen das Element mit dem Schlüssel titleauf den Wert link. Als solches sollte Ihr Array ein Objekt sein.

täuschen
quelle
17

Ich denke, Sie müssen ein Objekt definieren und dann das Array einschieben

var obj = {};
obj[name] = val;
ary.push(obj);
Jaydeep Patel
quelle
2

Sie könnten dies bedeuten:

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

Sie können eine Aufzählung für ein Objekt wie: ({})[0] = 'txt';und einen Schlüssel für ein Array wie: festlegen.([])['myKey'] = 'myVal';

Hoffe das hilft :)

Cody
quelle