为 DataTables aoColumnDefs 创建 JavaScript 数组(JSON 格式)

Posted

技术标签:

【中文标题】为 DataTables aoColumnDefs 创建 JavaScript 数组(JSON 格式)【英文标题】:Create JavaScript array (JSON format) for DataTables aoColumnDefs 【发布时间】:2012-08-31 22:37:30 【问题描述】:

我想为 DataTables 参数 aoColumnDefs 创建以下 JSON 数据:

var aryJSONColTable = [
                        "sTitle": "Column00", "aTargets": [0],
                        "sTitle": "Column01", "aTargets": [1],
                        "sTitle": "Column02", "aTargets": [2],
                        "sTitle": "Column03", "aTargets": [3]
                      ]

然后我将变量放入我的 DataTable 变量声明中,如下所示:

var oTable = $('#report').dataTable(
                                "aoColumnDefs": aryJSONColTable,
                                "bProcessing": true,
                                "bServerSide": true,
                                "bLengthChange": true,
                                "bFilter": true,
                                "aaSorting": [[ 3, "desc" ]],
                                "sScrollX": "100%",
                                "bScrollCollapse": true,
                                "bJQueryUI": true,
                                "sAjaxSource": "./getDataEA.php"
                            );

基于this useful discussion,我尝试了一个javascript循环来创建JSON数据aryJSONColTable,如下所示:

//create JSON array for aoColumnDefs
var aryColTableChecked = ["column00", "column01", "column02", "column03"];
var aryJSONColTable = [];

for (var i in aryColTableChecked) 
    aryJSONColTable.push(
                      "sTitle": aryColTableChecked[i],
                      "aTargets": [i]
                    );
;

我总是从上面的 JavaScript 循环中为数据“aTargets”获取值“1”,我希望为数据“aTargets”获取值 [running_index_number]。

请在这件事上帮助我。提前谢谢你。

【问题讨论】:

工作表。为什么你认为这些数组的第一个值总是1 这是您在所需输出中两次输入Column02 的错字吗? 是的,nnnnn,你的眼睛很敏锐 :-) 我已经编辑到 Column03。不过感谢您的评论。 【参考方案1】:

我建议您将for..in 循环更改为标准for 循环,因为使用for..in 迭代数组是“危险的”,因为如果您使用的库将属性/方法添加到@ 987654326@ 然后循环也会遍历这些。

另外,带有for..in 的迭代器i 将是一个字符串创建"aTargets" : ["0"],并且您希望它是一个数字来创建@ 987654330@.

var aryColTableChecked = ["column00", "column01", "column02", "column03"];
var aryJSONColTable = [];

for (var i = 0; i <  aryColTableChecked.length; i++) 
    aryJSONColTable.push(
                      "sTitle": aryColTableChecked[i],
                      "aTargets": [i]
                    );
;

似乎工作正常:http://jsfiddle.net/nnnnnn/Ek8tr/

注意:您生成的是不是 JSON,它是一个对象数组。 (JSON 是一种数据交换格式,始终是 字符串。 JSON 看起来像 JS 对象字面量和数组字面量语法,但不是一回事。)

【讨论】:

你不应该自己使用for-in-enumeration,那么:-) 但是,字符串(一个真实值)可能是这里的问题。 @Bergi - 糟糕 - 我以为我已经从我的小提琴中复制了标准的 for 代码,但我一定是从问题中复制了它。谢谢。固定的。我无法复制 OP 提到的问题,虽然 every 元素中有"1" 您好 nnnnnn,感谢您的快速回复。我已经尝试了您上面的建议,但我仍然得到数据“aTargets”的价值 [1]。此 JSON 格式在 JQuery DataTables 参数 aoColumnDefs 中指定,您可以查看此链接 datatables.net/usage/columns 了解更多详细信息。 我无法解释这个结果。您可以在我的 jsfiddle 演示中看到 aryJSONColTable 最终得到正确的值。您在什么时候检查值并找到[1]?在调用.dataTable() 方法之前还是之后? 是的,nnnnn,你说得对!它现在工作正常!以前我使用 Firebug-Watch 面板查看数组值,它总是向我显示数据“aTargets”的值 [1],但是当你深入了解它的值时,它真的会得到 [0]、[1] 等等.谢谢大家的大力帮助。我也开始按照您的建议学习如何使用 jsfiddle ;-)【参考方案2】:

for...in 用于对象而不是数组,aryColTableChecked 是一个数组。你可以这样做:

var arr = [];
var max = 3; // zero based
for (var i = 0, n; i <= max; i++) 
    n = i > 9 ? '' + i : '0' + i; // make sure it has 2 digits
    arr.push(
        sTitle: 'Column' + n,
        aTargets: [i] // why array here?            
    );

【讨论】:

+1:我认为问题“为什么在这里排列?”是真正的问题。 我想你想要max = 4i &lt;= max 酷。另一件事:我刚刚注意到您使用了i.length - 当i 是一个数字时,它是否有效? (IE 给了我undefinedi.length 所以我会使用i &gt; 9。) 在 Chrome 中为我工作 jsfiddle.net/reZrR 但我会按照 @bergi 的建议进行操作 max = 13试试你的小提琴,看看会发生什么。 undefined &gt; 1false

以上是关于为 DataTables aoColumnDefs 创建 JavaScript 数组(JSON 格式)的主要内容,如果未能解决你的问题,请参考以下文章

jquery datatables api

删除 DataTables 列中的额外填充

将 JSON 值加载到 dataTables textarea 字段中

DataTables warning: table id=DataTables_Table_0 - Requested unknown paramete

数据表 - 设置列宽

怎么使用ajax为 datatables 获取数据