2016-12-24 50 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