是否可以在Javascript中映射或排序数组的对象

时间:2017-04-27 21:42:13

标签: javascript php jquery arrays sorting

我从数据库中获取了大量数据,并希望显示表中的所有数据,但数据并未排序。有没有一种方法可以对数组的对象进行排序或映射,以便我知道哪些内容与什么内容一致,以便在每一行中显示正确的数据?

这是我获取数据的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;
}

4 个答案:

答案 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});