我从数据库中获取了大量数据,并希望显示表中的所有数据,但数据并未排序。有没有一种方法可以对数组的对象进行排序或映射,以便我知道哪些内容与什么内容一致,以便在每一行中显示正确的数据?
这是我获取数据的ajax调用:
//get the content, display all pages or specified page num
$.ajax({
type: 'POST',
url: 'qry/getRawText.php',
async: true,
data: {FileId: fileId, PageNum: pageNum},
success: function(response) {
getRawTextResponse = JSON.parse(response);
drawTextCodeContent();
}
});
这是我用数据绘制表格的地方:
function drawTextCodeContent() {
fileText = "<table id='fileTextTableId'><tbody>";
//loop through text files
for(i=0;i<getRawTextResponse.length;i++) {
//remove null from text
if(getRawTextResponse["RowData"][i] == null) {
getRawTextResponse["RowData"][i] == "";
}
//draw row
fileText += "<tr class='rowToEdit " + getRawTextResponse["RowStatus"][i] + "'><td class='hidden'>"+ getRawTextResponse["PageNum"][i] +"</td><td class='rowNumTd'>"+ getRawTextResponse["RowNum"][i] +"</td><td class='rowContentTd'><pre>"+ getRawTextResponse["RowData"][i] +"</pre></td><td class='rowCheckboxTd'><label class='mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect mdl-data-table__select' for='row[" + getRawTextResponse["RowNum"][i] + "]'><input type='checkbox' id='row[" + getRawTextResponse["RowNum"][i] + "]' class='mdl-checkbox__input' /></label></td></tr>";
}
fileText += "</tbody></table>";
//display table in div
$("#textCodeDiv").html(fileText);
}
以下是数据实际情况的预览:
Object {
PageNum: Array(66),
RowNum: Array(66),
RowStatus: Array(66),
RowData: Array(66),
length: 66
}
PageNum和RowNum是不按顺序排列的数字数组。 行状态和RowData是不按顺序排列的字符串数组。
以下是从db获取数据的整个PHP文件:
$fileId = $_POST["FileId"];
$pageNum = $_POST["PageNum"];
// Populate the query string
$tsql = "Exec TxRrcT1.GetRawText @FileId = ?, @PageNum = ?";
// Attempt to connect to SQL Server
if ( strtoupper(substr(PHP_OS, 0, 3)) == "WIN" ){
$conn = odbc_connect($connection_string, $user, $pass, SQL_CUR_USE_ODBC);
if ($conn === false ){ die(); }
}
else {
$conn = odbc_connect($connection_string, $user, $pass);
if ($conn === false ){ die(); }
}
// Prepare the stored procedure
$sp = odbc_prepare($conn, $tsql);
$params = array(
$fileId, //@FileId
$pageNum //@PageNum
);
// Execute procedure
$qryResults = TransformToObjectWithArrays($sp, $params);
// Close the connection
if ($conn !== false){ odbc_close($conn); }
// Return the query results
if (isset($qryResults)){ echo json_encode($qryResults); }
这是我最初的PHP函数,用于获取数据并将其转换为数组对象。我怎样才能将其更改为只返回数组数组中的数据?
// This function will prepare a tsql procedure and return the ODBC result
// identifier that can be used once the procedure is executed
function GetQryReturn($sp, $params){
$qryReturn = odbc_execute($sp, CleanInputs($params));
if ($qryReturn === false){ die(); }
return $sp;
}
function CleanInputs($InputArray){
return array_map(function($value){return $value === "" ? NULL : $value;}, $InputArray);
}
// This function takes a prepared stored procedure and any parameters and
// returns the query results as an objects with arrays
// example:
// {key1: [va1,val2], key2: [val1,val2]}
function TransformToObjectWithArrays($sp, $params){
// Execute query
$qryReturn = GetQryReturn($sp, $params);
// Populate array with results
$qryResults = array();
if( odbc_num_rows($qryReturn) ){
for($i=1; $i<=odbc_num_fields($qryReturn); $i++){
$qryResults[odbc_field_name($qryReturn, $i)] = array();
}
$qryResults["length"] = 0;
while( $row = odbc_fetch_array($qryReturn) ){
foreach($row as $key => $value){
array_push($qryResults[$key], $value);
}
$qryResults["length"] += 1;
}
}
else{
$qryResults["length"] = 0;
}
return $qryResults;
}
答案 0 :(得分:2)
我会将四个数组的对象转换为一个对象数组,每个对象都有四个对应不同数组的字段。那就是:
[
{
PageNum: 0,
RowNum: 0,
RowStatus: 'status',
RowData: 'data'
}
]
然后您可以轻松地对整个数组进行排序
<强>编辑:强>
要对数组进行排序,您使用sort方法:
var arr = [...]
arr.sort(function(a, b) {
// a and b are two element of your array (e.g. arr[i] and arr[j])
if(a.RowNum === b.RowNum) return 0;
if(a.RowNum < b.RowNum) return -1;
if(a.RowNum > b.RowNum) return 1;
})
答案 1 :(得分:0)
一般来说,我建议做排序服务器端。否则,您始终可以使用DataTables。它支持客户端排序。有时使用它可能很笨拙,但对我来说这是一个真正的节省时间。
答案 2 :(得分:0)
你可以使用
arr.sort(的compareFunction);
其中compare函数如下所示:
var numbers = [1, 5, 10, 15];
var roots = numbers.map(function(x) {
return x * 2;
});
有关排序检查的更多信息,请https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?v=control
对于映射使用类似这样的东西
create table somedata (
release_date timestamptz DEFAULT NOW()
)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map?v=example
答案 3 :(得分:0)
如果有人想知道或将来参考,这就是我想出来的。我把它包含在我的ajax成功函数中。
getRawTextResponse = JSON.parse(response);
//getNewRawText and map data
gNRT = getRawTextResponse.PageNum.map((x,i) => ({
index: i,
PageNum: x,
RowNum: getRawTextResponse.RowNum[i],
RowData: getRawTextResponse.RowData[i],
RowStatus: getRawTextResponse.RowStatus[i]
}));
//sort newly mapped array
gNRT.sort(function(a,b) {return a.RowNum - b.RowNum});