2012-10-13 133 views
3

我想創建一個JSON數組是這樣的:如何在JQuery中創建JSON數組?

var ddBasic = [ 
    { text: "Facebook", value: 1, }, 
    { text: "Twitter", value: 2, }, 
    { text: "LinkedIn", value: 3, }, 
    { text: "Foursquare", value: 4, } 
]; 

我使用的是從last.fm的數據,所以這將是這樣的:

var tags = [ 
     { text: "rock", value: "rock", }, 
     { text: "pop", value: "pop", }, 
    ]; 

它需要有一個逗號在年底,因此ddslick下拉功能將忽略imageSrc和其他的東西也可以使用下拉,其他它拋出這個錯誤:

Uncaught TypeError: Cannot read property 'imageSrc' of undefined 

要一切都綁在一起,我有:

$('#tag').ddslick({ 
    data: tags, 
    onSelected: function(selectedData) {} 
}); 

這是獲取標籤的功能:

var tags = []; 

var getTopTracks = function() { 
    $.getJSON(
    settings.PHP_REQUEST_URL, { 
     method: "tag.getTopTags", 
     api_key: settings.LASTFM_APIKEY, 
     format: "json", 
    }, 

    function (data) { 
     var limit = 50; 

     data.toptags.tag.sort(function (t1, t2) { 
      return t2.count - t1.count; 
     }); 

     $.each(data.toptags.tag, function (i, item) { 
      if (i > limit) return false; 
      console.log(item.name); 
      tags.push({ 
       text: item.name, 
       value: item.name 
      }); 
     }); 
    }); 
}; 

// event handlers (load quando o form é invocado só) 
getTopTracks(); 
alert(tags.length); 

// define tema para a combobox 
$('#tag').ddslick({ 
    data: tags, 
    onSelected: function (selectedData) {} 
}); 

我怎樣才能做到這一點?

+0

你說這正常工作與逗號?我不明白這會如何改變。 – sachleen

+0

哦...顯然這不是逗號,它是我的陣列中的東西。我用'tags.push({「text」:item.name,「value」:item.name})推送值;' - 這是正確的語法嗎?推後長度顯示爲0,這讓我想知道什麼是錯的。 – swiftcode

+0

檢查控制檯是否有錯誤...是否定義了「項目」? – sachleen

回答

2
var tags = []; //initialised tags with length 0 
getTopTracks(); //fetching date in background (!) 
alert(tags.length); //running while data is still fitched (unless you've a 0ping connection => alerting length 0 

在你使用它很可能tags沒有填充爲$.getJSON()警報的點是asynchronus請求,這意味着請求將在腳本的背景和執行進行處理,繼續進行。您必須使用回調方法來填充數組。

This, getJSON, is a shorthand Ajax function, which is equivalent to: 
$.ajax({ 
    url: url, 
    dataType: 'json', 
    data: data, 
    success: callback 
}); 

http://api.jquery.com/jQuery.getJSON/

//getJSON success callback: 
function (data) { 
    var limit = 50; 

    data.toptags.tag.sort(function (t1, t2) { 
     return t2.count - t1.count; 
    }); 

    $.each(data.toptags.tag, function (i, item) { 
     if (i > limit) return false; 
     console.log(item.name); 
     tags.push({ 
      text: item.name, 
      value: item.name 
     }); 
    }); 
    //alert the length AFTER the tags been pushed 
    alert(tags.length); 

    // define tema para a combobox 
    $('#tag').ddslick({ 
     data: tags, 
     onSelected: function (selectedData) {} 
    }); 
} 
+0

哦哇,這是因爲我在頁面加載時這樣做,這意味着它在調用之前加載元素。我該如何等待,直到完成? – swiftcode

+0

您將'$ .each'之後的代碼移動到回調方法中。所以你要確保它在數組填充後被執行。 – yoshi

+0

謝謝,這解決了我的問題! – swiftcode