如何在JQuery中创建JSON数组?

3
我想创建一个类似这样的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) {}
});

我该如何完成这个任务?

你是说用逗号可以正常工作?我不明白那会有什么区别。 - sachleen
哦...显然不是逗号的问题,而是我的数组里有些东西。我正在使用tags.push({"text" : item.name, "value" : item.name});来添加值-这是正确的语法吗?在推送后长度显示为0,这让我想知道出了什么问题。 - swiftcode
请检查控制台是否有错误... item 是否已定义? - sachleen
1
@sachleen:可能性是存在的,但这意味着还有另一个“tags”变量藏在某个地方(好吧,在哪里?),否则,“push”会抛出类似于“无法对未定义的内容调用push”的错误。 - nuala
1
已解决,原因是我在 AJAX 完成请求之前尝试获取值。问题已经解决。非常感谢您的帮助。 - swiftcode
显示剩余4条评论
1个回答

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()是一个异步请求,这意味着请求将在后台处理,脚本的执行会继续。您必须像填充数组一样使用回调方法。

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

哦,哇,这是因为我是在页面加载时执行的,这意味着在调用之前加载元素。我该如何等到它完成? - swiftcode
$.each后面的代码移动到回调方法中,以确保在数组填充后执行。 - nuala
值是正常的,但文本属性显示为未定义: - Can Ürek
@Can Ürek:嗯,我真的无法理解。您能否用最小的示例编写另一个问题来描述您的问题? - nuala
我来处理这个问题。我的解决方案是这样的。var json = {}; json[name] = value; 这对我很有效。 - Can Ürek
很高兴听到你已经解决了它 ^.^/ - nuala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接