Como inserir chave e valor em um Array em Jquery

88

Estou lendo RSS feed e colocando Título e Link em um Array no Jquery .

O que eu fiz foi

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 estou lendo essa matriz novamente usando

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

Mas está me dando saída como

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

como isso ...

Como posso obter o bloco e o link como um par ( título como chave e link como valor )

KillerFish
fonte

Respostas:

183

Não há chaves em matrizes JavaScript. Use objetos para esse propósito.

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

Em JavaScript, os objetos cumprem a função de matrizes associativas. Esteja ciente de que os objetos não têm uma "ordem de classificação" definida ao iterá-los (veja abaixo).

No entanto , no seu caso, não está realmente claro para mim por que você transfere dados do objeto original ( data.news). Por que você simplesmente não passa uma referência a esse objeto?


Você pode combinar objetos e matrizes para obter iteração previsível e comportamento de chave / valor:

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
fonte
30

Este código

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

não está fazendo o que você pensa que faz. O que é enviado é um novo objeto com um único membro chamado "título" e com linko valor ... o titlevalor real não é usado. Para salvar um objeto com dois campos, você deve fazer algo como

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

ou com os avanços recentes do Javascript, você pode usar o atalho

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

A coisa mais próxima de uma tupla python seria, em vez disso,

arr.push([title, link]);

Depois de ter seus objetos ou matrizes na arrmatriz que você pode obter os valores quer como value.titlee value.link, ou, no caso da versão com matriz empurrado, como value[0], value[1].

6502
fonte
17
arr[title] = link;

Você não está empurrando para o array, você está definindo o elemento com a chave titlepara o valor link. Como tal, sua matriz deve ser um objeto.

deceze
fonte
17

Acho que você precisa definir um objeto e, em seguida, inserir o array

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

Você pode querer dizer isto:

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

Você pode definir um enumerável para um objeto como: ({})[0] = 'txt';e você pode definir uma chave para um Array como:([])['myKey'] = 'myVal';

Espero que isto ajude :)

Cody
fonte