2016-09-29 63 views
0

陣列對象我有一個數組:排序用於使用缺省的.sort在JavaScript中需要()

var array = [ 
{ID : 1, 
Name : one, 
data : {more info here} 
}, 
{ID : 2, 
Name : two 
}, 
{ID : 3, 
Name : three, 
data : {more info here} 
}, 
{ID : 4, 
Name : four 
}, 
{ID : 5, 
Name : five, 
data : {more info here} 
},] 

需要排序這些陣列,其中數據是本將是頂部,然後其他。 最終排序結果將是 -

[{ID:1,name: one,data: {}}, 
{ID:3,name: three,data: {}}, 
{ID:5,name: five,data: {}}, 
{ID:2,name: two}, 
{ID:4,name: four}] 
+0

通過「地方數據存在將是頂部,那麼其他」你實際上意味着希望所有那些'data'第一,排序增加'ID'順序,那麼所有那些沒有'數據'的人也按增加的'ID'順序排序? – Makyen

+0

順便說一句:如果你以隨機順序提供輸入數組,那會更好。實際上,一些答案依賴於數組的輸入順序,最終以您指定爲輸出的整體數組順序結束。如果你所關心的是所有帶有'data'的人都應該在所有沒有'data'的人之前,並且你不關心他們在這兩個組中的順序,那麼提供隨機輸入可能並不重要。換句話說,如果數組的結果是OK,如果'ID'的順序是[5,1,3,4,2]',那麼這可能沒有關係? – Makyen

+0

注:我投下了票,因爲你的問題目前並沒有說明結果數組是否也應該用'ID'排序(即你的問題意味着這可能是這種情況,但不清楚)。如果你澄清說你有或沒有關心'數據'/沒有'數據'子組中'ID'的順序,我將刪除我的棄權票。如果你確實澄清了這一點(單向或者其他),請在裏面留下@ @ Makyen的評論,所以我會通知他回來看看。 – Makyen

回答

3

你可以使用屬性的boolen值的增量。

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }]; 
 

 
array.sort(function (a, b) { 
 
    return !a.data - !b.data; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

另一個版本有講究的關鍵可能是存在的檢查。

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }]; 
 

 
array.sort(function (a, b) { 
 
    return ('data' in b) - ('data' in a); 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

從問題中不清楚它是否是必需的,但是這當前依賴於輸入數組的順序以使結果最終匹配請求的輸出數組順序。換句話說,你不檢查'''在具有'數據'的內部進行排序並且不具有'數據'組。換句話說,您依靠輸入數組已經被'ID'排序,以便您的'data'/non-'data'組被'ID'排序。 – Makyen

+0

你是對的,結果與給定的排序參數不穩定。對於一個穩定的值,有必要添加另一個參數來進行排序。 –

0

如果在所需的排序唯一重要的事情是data財產的存在與否,是不是從問題明確。所需的「最終分類結果」顯示首先按data的存在或不存在排序的數據,但是然後在這些組內以ID的升序排序。按ID進行排序可能僅僅是起始數組順序的人爲因素,並不是問題的必需部分。另一方面,可能需要通過data然後ID進行排序。

的其他解決方案要麼不排序在所有基於所述IDNina Scholz's answer),或排序兩者dataID,但這樣做錯誤地依賴於輸入陣列(Rajesh's answer)上。兩者都依賴於輸入數組的順序來提供所需的結果數組。

以下代碼將首先根據這兩個子組中是否存在data,然後是ID對數組進行排序。

排序原始提供的輸入數組:

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }]; 
 

 
array.sort(function(a, b) { 
 
    if(a.data && !b.data) { 
 
    // a has data, b does not have data, a is first 
 
    return -1; 
 
    } 
 
    if(!a.data && b.data) { 
 
    // a does not have data, b does have data, b is first 
 
    return 1; 
 
    } 
 
    // a and b either both have data, or both don't have data. Sort the smaller ID first. 
 
    return a.ID - b.ID; 
 
}); 
 
console.log(array)

下面是相同的排序開始與來自Rajesh's updated answer使用的一個略加修改的輸入數組。該答案中的數組已被修改爲將ID:4,更改爲ID:41,。通過修改後的輸入數組,Rajesh的排序會產生錯誤的結果。此代碼將通過dataID正確排序。

var array=[{ID:1,Name:"one",data:{"more info here":"something"}},{ID:2,Name:"two"},{ID:30,Name:"Thirty",data:{"more info here":"something"}},{ID:41,Name:"four"},{ID:5,Name:"five",data:{"more info here":"something"}},{ID:40,Name:"fourty",data:{"more info here":"something"}},{ID:300,Name:"threeHundred",data:{"more info here":"something"}},{ID:20,Name:"twenty"},{ID:3e3,Name:"threeThousand",data:{"more info here":"something"}}]; 
 

 
array.sort(function(a, b) { 
 
    if(a.data && !b.data) { 
 
    // a has data, b does not have data, a is first 
 
    return -1; 
 
    } 
 
    if(!a.data && b.data) { 
 
    // a does not have data, b does have data, b is first 
 
    return 1; 
 
    } 
 
    // a and b either both have data, or both don't have data. Sort the smaller ID first. 
 
    return a.ID - b.ID; 
 
}); 
 
console.log(array)