基于json数组的键创建jQuery数组

时间:2014-11-27 08:34:14

标签: javascript jquery arrays json

我有一个由ajax响应发送的json数组。

json数组采用以下方式

[{"id":"11105","name":"Gummy Drop (iPhone, Free, ROW except CN, 72.3MB, w"},{"id":"11107","name":"Gummy Drop (iPad, Free, ROW except CN, 72.3MB, w\/ "},{"id":"4274","name":"Z-Redirect Non-Targeted Traffic Dragon City Mobile"},{"id":"6484","name":"Z-Redirect Non-Targeted Traffic Dragon City Mobile"}]

现在,有时,密钥可以是idname,有时可以是rolladdress

所以它并不总是可预测的或者是一些。

我需要获取此JSON数组/对象的密钥形式并构建类似这样的东西

var aColumns = [{ sTitle: "id"}, { sTitle: "name" }];

有人向我建议了一段代码,如下:

$.post("ajax.php",{'version':v,'category':ctg,'country':cnt,'func':'show_datatable'},
                        function(data)
                        {
                            /*var aColumns = [{ sTitle: "Week"}, { sTitle: "Winkelformule" }];*/
                            for(var i = 0; i < data.length; i++) 
                            {
                                keycolumns = Object.keys(data[i]); 
                                for(j = 0; j < keycolumns.length; j++)
                                {
                                    alert(keycolumns[j]);
                                    if($.inArray(keycolumns[j],aColumns.sTitle)<=0)
                                    {
                                        aColumns.push({sTitle: keycolumns[j]}) //Checks if 
                                    }                                     
                                }
                            }
                       },'json');

看来他的想法是正确的,但在这些方面有些可疑:

if($.inArray(keycolumns[j],aColumns.sTitle)<=0)
    {
        aColumns.push({sTitle: keycolumns[j]}) //Checks if 
    }

1 个答案:

答案 0 :(得分:1)

var aColumns = [];

data.forEach(function (el) {    
    Object.keys(el).forEach(function (key) {
        if (!~aColumns.indexOf(key)) {
            aColumns.push(key);
        }
    })
})

aColumns = aColumns.map(function (key) {
    return {sTitle: key};
});

console.log(aColumns);

演示:http://jsfiddle.net/e50rwfbr/

- 这条线不正确

if($.inArray(keycolumns[j], aColumns.sTitle)<=0)

你需要检查aColumns而不是keycolumns ..像这样

var aColumns = [], i, j;

for(i = 0; i < data.length; i++) {
    keycolumns = Object.keys(data[i]);

    for (j = 0; j < keycolumns.length; j++) {
        if (!aColumns.length || !aColumns.filter(function(el) { return el.sTitle == keycolumns[j]; }).length) {
            aColumns.push({sTitle: keycolumns[j]});
        }                                
    }
}

DEMO:http://jsfiddle.net/e50rwfbr/2/