排序json忽略空白值

时间:2015-08-12 08:34:49

标签: javascript jquery json sorting

我有以下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数据顺序,因为我无法访问它。

3 个答案:

答案 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。

  1. 采取指数位置。
  2. 从JSON数组中删除它。
  3. 对剩余的JSON数组进行排序。
  4. 在相应的索引位置推送空白值。
  5. 完成!

答案 2 :(得分:0)

您可以在排序前添加第三个字段来考虑分组值。

e.g。在0处启动组,循环遍历设置组字段的数组,在检测到下一个非空白时将其递增。

然后我想你可以在第一次排序后应用第二种排序(按组)。