我有以下JSON数据:
var json = [{ "name":"A", "value":"valueA"},
{ "name":" ", "value":"VALUES"},
{ "name":"Z", "value":"values"},
{ "name":" ", "value":"VALUES12"},
{ "name":" ", "value":"VALUES123"},
{ "name":"B", "value":"valueBS"},
{ "name":" ", "value":"VALUES123"}];
我想按字母顺序对数据进行排序,但在非空 name
之后将空 name
值保留在同一位置。所以预期的产出是:
[{ "name":"A", "value":"valueA"},
{ "name":" ", "value":"VALUES"},
{ "name":"B", "value":"valueBS"},
{ "name":" ", "value":"VALUES123"},
{ "name":"Z", "value":"values"},
{ "name":" ", "value":"VALUES12"},
{ "name":" ", "value":"VALUES123"}]
我尝试过以下方法
function sortResults(prop, asc, array) {
arr = array.sort(function(a, b) {
if (asc) return (a[prop] > b[prop]);
else return (b[prop] > a[prop]);
});
return arr;
}
并以下列方式调用它
var sorted = sortResults('name', true, json);
这会对数组进行排序,但空白也会重新排序,我不想要。解决这个问题的最佳方法是什么?
注意:我无法从服务器更改JSON数据顺序,因为我无法访问它。
答案 0 :(得分:1)
您可以尝试使用高阶功能来完成此操作。此外,您可以reduce对数据进行排序,然后map对结果进行排序。
通过使用高阶函数,您的代码将更具可重用性。因此,我们将执行地图和减少转换。
var json = [
{ "name":"A", "value":"valueA"},
{ "name":" ", "value":"VALUES"},
{ "name":"Z", "value":"values"},
{ "name":" ", "value":"VALUES12"},
{ "name":" ", "value":"VALUES123"},
{ "name":"B", "value":"valueBS"},
{ "name":" ", "value":"VALUES123"}
];
//Create a generator function in order to sort by specifing key
function sortBy(key){
return function(a, b) {
return a[key] < b[key]?-1:(a[key] > b[key])?1:0;
}
}
function sorting(json){
//Reduce my json data and start with empty array
var sorted = json.reduce(function(result, current){
return current.name !== ' '
//Build a sorted array
? result.concat(current).sort(sortBy('name'))
//Return current sorted array
: result
}, []);
return json.map(function(elm, index, self){
return elm.name !== ' '
//Retrieve the first element of sorted array by shifting it
? sorted.shift()
//Then, retrieve current elm in json array
: elm
});
}
console.log(sorting(json));
答案 1 :(得分:0)
通过选中空白名称来迭代您的JSON。
完成!
答案 2 :(得分:0)
您可以在排序前添加第三个字段来考虑分组值。
e.g。在0处启动组,循环遍历设置组字段的数组,在检测到下一个非空白时将其递增。
然后我想你可以在第一次排序后应用第二种排序(按组)。