2015-10-07 32 views
-1

我有對象的JSON數組,看起來是這樣的:的JavaScript數組排序2個性能

var garments [{ 
    name: 'Garment 1', 
    isDesignable: false, 
    priority: 3 
},{ 
    name: 'Garment 2', 
    isDesignable: false, 
    priority: 1 
},{ 
    name: 'Garment 3', 
    isDesignable: true, 
    priority: 3 
},{ 
    name: 'Garment 4', 
    isDesignable: true, 
    priority: 2 
},{ 
    name: 'Garment 5', 
    isDesignable: true, 
    priority: 4 
}]; 

起初,我需要通過優先,所以我這樣做是爲了對數組進行排序:

garments.sort(function (a, b) { 

    // By priority 
    return a.priority - b.priority; 
}); 

這很好。但現在,我意識到如果服裝不是可設計的,那麼它應該位於陣列的底部,而不管它是否優先。任何人都可以幫助我使用排序功能,因此所有非設計的服裝都處於最底層嗎?

回答

1

使用一行代碼的解決方案。

首先建立isDesignable之間的差異,如果相同,則應用差異priority作爲排序指標。

var garments = [{ 
 
     name: 'Garment 1', 
 
     isDesignable: false, 
 
     priority: 3 
 
    }, { 
 
     name: 'Garment 2', 
 
     isDesignable: false, 
 
     priority: 1 
 
    }, { 
 
     name: 'Garment 3', 
 
     isDesignable: true, 
 
     priority: 3 
 
    }, { 
 
     name: 'Garment 4', 
 
     isDesignable: true, 
 
     priority: 2 
 
    }, { 
 
     name: 'Garment 5', 
 
     isDesignable: true, 
 
     priority: 4 
 
    }]; 
 
// sort isDesignable first and then by priority ascending 
 
garments.sort(function (a, b) { 
 
    return b.isDesignable - a.isDesignable || a.priority - b.priority; 
 
}); 
 
document.write('<pre>' + JSON.stringify(garments, 0, 4) + '</pre>'); 
 

 
// sort reversing the former sort order by sorting, not reversing 
 
garments.sort(function (a, b) { 
 
    return a.isDesignable - b.isDesignable || b.priority - a.priority; 
 
}); 
 
document.write('<pre>' + JSON.stringify(garments, 0, 4) + '</pre>');

4
garments.sort(function (a, b) { 
    if (a.isDesignable == b.isDesignable) { 
     return a.priority - b.priority; 
    } else if (a.isDesignable) { 
     return -1; 
    } else { 
     return 1; 
    } 
}); 
+0

我能問回報1位是什麼? – r3plica

+0

這就是比較函數應該做的事情:返回值<0, 0 or > 0表示第一個元素低於,等於或高於第二個元素。 'a'不是可設計的,而是'b'時,'return 1'就是這種情況。 – deceze

+0

我不知道爲什麼,但是這個函數返回數組前面的非可設計對象,然後優先級從高到低排列。我需要它相反的方式 – r3plica