通过Ajax返回表时,可以分别使用列名和行值,如下所示:
let columns = ["col1", "col2", "col3"];
let rows = [
["row 1 col 1", "row 1 col 2", "row 1 col 3"]
, ["row 2 col 1", "row 2 col 2", "row 2 col 3"]
, ["row 3 col 1", "row 3 col 2", "row 3 col 3"]
, ["row 4 col 1", "row 4 col 2", "row 4 col 3"]
, ["row 5 col 1", "row 5 col 2", "row 5 col 3"]
];
或者像这样的关联数组
let rows = [
{ "col1": "row 1 col 1", "col2": "row 1 col 2", "col3": "row 1 col 3" }
, { "col1": "row 2 col 1", "col2": "row 2 col 2", "col3": "row 2 col 3" }
, { "col1": "row 3 col 1", "col2": "row 3 col 2", "col3": "row 3 col 3" }
, { "col1": "row 4 col 1", "col2": "row 4 col 2", "col3": "row 4 col 3" }
, { "col1": "row 5 col 1", "col2": "row 5 col 2", "col3": "row 5 col 3" }
];
现在,如果有很多数据,第一个变量将导致传输的数据更少。
问题是,我不能像行[i][“col1]那样访问它,因为我可以使用第二个变量。
现在,我可以只获取行和列,然后从中创建一个关联数组,比如
let columns = ["col1", "col2", "col3"];
let data = [
["row 1 col 1", "row 1 col 2", "row 1 col 3"]
, ["row 2 col 1", "row 2 col 2", "row 2 col 3"]
, ["row 3 col 1", "row 3 col 2", "row 3 col 3"]
, ["row 4 col 1", "row 4 col 2", "row 4 col 3"]
, ["row 5 col 1", "row 5 col 2", "row 5 col 3"]
];
let arr = [];
for (let j = 0; j < data.length; ++j)
{
let obj = {}; // "associative array" or Object
for (let i = 0; i < columns.length; ++i)
{
obj[columns[i]] = data[j][i];
}
arr.push(obj);
}
但是我必须复制对象,如果行数和列数很大,这可能需要时间和内存。
有没有什么好的(非时间和非内存消耗)方法可以在JavaScript中实现这一点?
我需要的是索引属性,但它们似乎不存在于javascript中…
我最近得到的是代理对象:
let columns = ["col1", "col2", "col3"];
let rows = [
["row 1 col 1", "row 1 col 2", "row 1 col 3"]
, ["row 2 col 1", "row 2 col 2", "row 2 col 3"]
, ["row 3 col 1", "row 3 col 2", "row 3 col 3"]
, ["row 4 col 1", "row 4 col 2", "row 4 col 3"]
, ["row 5 col 1", "row 5 col 2", "row 5 col 3"]
];
let cols = {}; // "associative array" or Object
for (let i = 0; i < columns.length; ++i)
{
cols[columns[i]] = i;
}
let handler2 = {
get: function (obj, prop, receiver)
{
return obj[cols[prop]];
}
};
// https://www.sitepoint.com/es6-proxies/
let handler = {
get: function (obj, prop, receiver)
{
console.log("obj:", obj, "prop:", prop, "receiver :", receiver);
//return obj[prop];
//return obj[cols[prop]];
return new Proxy(obj[prop], handler2);
}
, set: function (obj, key, value)
{
console.log(obj, key, value);
}
};
let p = new Proxy(rows, handler);
这里的问题是——除了IE11不支持代理之外——我需要在每行访问上创建一个新的代理,因为它看起来不支持对象数组……
在一个
良好/性能良好
怎么样?
我最不想写的就是这样的代码:
let columns = ["col1", "col2", "col3"];
let rows = [
["row 1 col 1", "row 1 col 2", "row 1 col 3"]
, ["row 2 col 1", "row 2 col 2", "row 2 col 3"]
, ["row 3 col 1", "row 3 col 2", "row 3 col 3"]
, ["row 4 col 1", "row 4 col 2", "row 4 col 3"]
, ["row 5 col 1", "row 5 col 2", "row 5 col 3"]
];
let cols = {}; // "associative array" or Object
for (let i = 0; i < columns.length; ++i)
{
cols[columns[i]] = i;
}
let index_col1 = cols["col1"];
let index_col2 = cols["col2"];
let index_col3 = cols["col3"];
for (var i = 0; i < rows.length; ++i)
{
console.log("col1:", rows[i][index_col1], "col2:", rows[i][index_col2], "col3:", rows[i][index_col3]);
}
这就是我现在要做的…