2016-12-24 71 views
-2

我的數據是這樣排序的數據:有空白或缺口

var dataset = [ 
    { "field1":"val1", "field2":"val2", "field3":"34.11" }, 
    { "field1":"val4", "field2":"val5", "field4":"2/3/2015" }, 
    { "field1":"val6", "field2":"val7", "field3": "26.37", "field4":"4/2/2015" } 
] ; 

正如你看到這些數據被丟失在第二行「字段3」,並在第一行中缺少「字段4」,所以我怎麼能僅使用JavaScript對這些數據進行排序?如果這不行的話,可以通過循環數據集來輸入每一行中缺少的字段?因爲我無法控制傳入的數據。

我能排序爲字符串和數字,但該數據集只有當所有行存在於例如這對於字符串列:

dataset.sort(function (a, b) { 
    var nameA = a.field1.toUpperCase(); // ignore upper and lowercase 
    var nameB = b.field1.toUpperCase(); // ignore upper and lowercase 

    if (nameA < nameB) { 
    return -1; 
    } 
    if (nameA > nameB) { 
    return 1; 
    } 

    return 0; 
}); 

所需的輸出是HTML表,但我知道如何生成此表使用Javascript,所以我只是希望能夠根據列值類型分別排序每個列asc或desc。例如,對於場3排序ASC應該

var dataset = [ 
    { "field1":"val4", "field2":"val5", "field4":"2/3/2015" },  
    { "field1":"val6", "field2":"val7", "field3": "26.37", "field4":"4/2/2015" },  
    { "field1":"val1", "field2":"val2", "field3":"34.11" }  

] ; 

更新: 我的代碼試圖基於場3排序,但我得到不正確的排序

dataset.sort(function (a, b) { 

    var nameA = Number(a.field3); 
    var nameB = Number(b.field3); 

    return (nameB - nameA); 
}); 
+0

你能解釋一下你如何/要排序呢?什麼是期望的輸出? – Dekel

+0

我打算在html表格中使用Javascript顯示這些數據,並且我想對每列asc或desc進行排序,但是要分別進行更新 – Wel

+3

用所需的輸出更新問題。 **排序 – Dekel

回答

1

代碼:

dataset.sort(function (a, b) { 

    var nameA = Number(a.field3)||0; //if value is NaN use 0 
    var nameB = Number(b.field3)||0; //if value is NaN use 0 

    return (nameA - nameB); //wrong order (nameB - nameA) returns greatest to least 
}); 

輸出:

[ 
    { 
    "field1": "val4", 
    "field2": "val5", 
    "field4": "2/3/2015" 
    }, 
    { 
    "field1": "val6", 
    "field2": "val7", 
    "field3": "26.37", 
    "field4": "4/2/2015" 
    }, 
    { 
    "field1": "val1", 
    "field2": "val2", 
    "field3": "34.11" 
    } 
] 

字段4:

dataset.sort(function (a, b) { 
    var nameA = (new Date(a.field4)); 
    if (isNaN(nameA.getTime())) { //checks if date is invalid 
    nameA = -10e15; 
    } 
    var nameB = (new Date(b.field4)); 
if (isNaN(nameB.getTime())) { 
    nameB = -10e15; 
    } 
    return (nameA - nameB); 
}); 

數據集:

var dataset = [ 
    { "field1":"val4", "field2":"val5", "field4":"2/3/2015" },  
    { "field1":"val6", "field2":"val7", "field3": "26.37", "field4":"4/2/2015" },  
    { "field1":"val1", "field2":"val2", "field3":"34.11" },  
    { "field1":"val1", "field2":"val2", "field3":"34.11", "field4":"4/1/2003" }  
] ; 

數據集輸出:

[ 
    { 
    "field1": "val1", 
    "field2": "val2", 
    "field3": "34.11" 
    }, 
    { 
    "field1": "val1", 
    "field2": "val2", 
    "field3": "34.11", 
    "field4": "4/1/2003" 
    }, 
    { 
    "field1": "val4", 
    "field2": "val5", 
    "field4": "2/3/2015" 
    }, 
    { 
    "field1": "val6", 
    "field2": "val7", 
    "field3": "26.37", 
    "field4": "4/2/2015" 
    } 
] 
+0

此代碼不是通用的。如果你有更多的缺失字段(而不僅僅是field3),這段代碼將不起作用。 – Dekel

+0

請幫助我如何爲field4的日期類型做同樣的事情? – Wel

+0

答案已被編輯以顯示如何爲field4執行此操作。我會研究製作一個通用版本。 –

0

這裏是一個一般的排序功能。

如果你有一個缺失的字段 - 這個字段得到第一。否則 - 訂單將基於相同字段值的localeCompare

var dataset = [ 
 
    { "field1":"val1", "field2":"val2", "field3":"34.11" }, 
 
    { "field1":"val4", "field2":"val5", "field4":"2/3/2015" }, 
 
    { "field1":"val6", "field2":"val7", "field3": "26.37", "field4":"4/2/2015" } 
 
] ; 
 

 
dataset.sort(function (a, b) { 
 
    aFields = Object.keys(a).sort() 
 
    bFields = Object.keys(b).sort() 
 
    i = 0; 
 
    if (aFields[i] == bFields[i]) { 
 
    if (a[aFields[i]].localeCompare(b[bFields[i]]) == 0) { 
 
     i++; 
 
    } else { 
 
     return a[aFields[i]].localeCompare(b[bFields[i]]); 
 
    } 
 
    } else { 
 
    return bFields[i].localeCompare(aFields[i]); 
 
    } 
 
}); 
 

 
console.log(dataset)

+0

我相信這不符合他或她的預期輸出。 –

+0

他說如果一個領域缺失,它應該被視爲空==首先,這正是發生在這裏。 – Dekel

+0

謝謝,但我需要對每列分開排序,以便Steven Tang發佈的代碼可以完美地用於field3 – Wel