2014-04-06 16 views
2

我有一個JSON對象類似如下:排序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)); 
     }); 
    }, 

這工作得很好。我想要做的就是排除{「全部」:「有針對性的」}:

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

可能有人給我如何能暗示從分揀和總是有它的JSON對象,像這樣的第一要素這個成就了嗎?基本上我需要一種方法來排除JSON對象中的任何項目,並將其設置爲對象的第一個元素。

在此先感謝!

+1

也許你可以對它進行排序,然後移動該項目。或者先刪除它,然後重新添加它。 – GolezTrol

+0

我不確定'sortByKey'如你所想。你的任何物體都沒有相同的鍵,所以你不能按它排序。您最終會將「undefined」與「undefined」進行排序。如果他們結束了排序,這是幸運的。不管怎麼說,正如@GolezTrol暗示的那樣,我不是試圖修改你的排序函數來尊重「全部」,我會沿着正常排序並移動它的路線,或者先移除它,然後釘住它,*或*不行即使首先將它列入清單,然後再添加它。 – Matt

回答

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

假設arr是你的數組,最簡單的方法是取第一個元素使用shift這會讓你剩餘的元素在數組中循環,之後你可以將第一個元素加回到數組的開始使用unshift

var first = arr.shift(); 

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

arr.unshift(first); 

或者,如果「所有」元素是不是在數組的開頭,使用map/filter搶的「所有」的指數,然後使用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); 
+0

@Matt,歡呼聲。花了一點時間,但發現這個問題的體面解決方案。 – Andy

+1

注意'splice()'返回一個被移除元素的*數組,所以你需要'var first = arr.splice(index,1)[0]'。有時候,簡單的'for(;;)'循環可能比「posh」* new *數組方法更適合;這可能是其中之一(http://jsfiddle.net/JGeey/) – Matt