排序除项目之外的JSON对象

时间:2014-04-06 13:32:47

标签: javascript jquery json sorting

我有一个JSON对象,如下所示:

[
    {"AT&T" : "Blocked"},
    {"All" : "Targeted"},
    {"Verizon" : "Blocked"},
    {"Sprint" : "Blocked"}
]

我使用以下函数按字母顺序排序:

sortByKey : function(array, key) {
        return array.sort(function(a, b) {
            var x = a[key]; var y = b[key];
            return ((x < y) ? -1 : ((x > y) ? 1 : 0));
        });
    },

这很好用。我想要做的是排除{&#34;所有&#34; :&#34; Targeted&#34;}来自排序并始终将它作为JSON对象的第一个元素,如下所示:

[
   {"All" : "Targeted"},
   {"AT&T" : "Blocked"},
   {"Sprint" : "Blocked"}
   {"Verizon" : "Blocked"}, 
]

有人能给我一些关于如何实现这一目标的提示吗?基本上我需要一种方法来排除JSON对象中的任何项目,并将其设置为对象的第一个元素。

提前致谢!

2 个答案:

答案 0 :(得分:5)

如果你想排除一个值,例如将它保持在排序的顶部,每当你的排序函数遇到它时,如果第一个参数它总是返回-1,如果它是第二个参数,则返回1

//Keep 2 at the front
[1,254,6,2,62].sort(function(a,b){
  if(a == 2) return -1; else if(b == 2) return 1;
  return a-b;
});

[2, 1, 6, 62, 254]

//Keep 2 at the back
[1,254,6,2,62].sort(function(a,b){
  if(a == 2) return 1; else if(b == 2) return -1;
  return a-b;
});

[1, 6, 62, 254, 2]

答案 1 :(得分:1)

假设arr是您的数组,最简单的方法是使用shift获取第一个元素,这将使您在数组中的其余元素循环,之后您可以只添加第一个元素使用unshift回到数组的开头:

var first = arr.shift();

// arr now contains just the other elements
// do your sorting

arr.unshift(first);

或者,如果'All'元素不在数组的开头,使用map / filter获取'All'的索引,则使用splice获取新数组,然后使用unshift添加元素。

var index = arr.map(function(el, i) {
  if (Object.keys(el)[0] === 'All') { return i; }
}).filter(Number)[0];

var first = arr.splice(index, 1)[0];

// arr now contains just the other elements
// do your sorting

arr.unshift(first);