2017-03-09 42 views
0

我有2個包含對象的數組,我想用適合條件的所有對象創建一個數組,並按一個屬性排序。如何獲取按不同數組的屬性排序的對象?

這些都是我的陣列

var mandatorySections = [ 
    {ordered_position:0,loaded:false}, 
    {ordered_position:2,loaded:false}, 
    {ordered_position:4,loaded:true} 
    {ordered_position:8,loaded:false}], 
optionnalSections = [{ordered_position:3,loaded:false}]; 

而且我要包含尚未裝入,在ordered_position爲了所有對象,像這樣的數組:

var result = [ 
    {ordered_position:0,loaded:false}, 
    {ordered_position:2,loaded:false}, 
    {ordered_position:3,loaded:false}, 
    {ordered_position:8,loaded:false}]; 
+0

你已經描述了你想要什麼,但沒有顯示你所嘗試的或你對過程有什麼具體問題。 – csmckelvey

+0

合併兩個數組,按「已加載」鍵過濾,然後按「ordered_position」鍵進行排序。你不知道該怎麼做? – JJJ

回答

3

var mandatorySections = [ 
 
    {ordered_position:0,loaded:false}, 
 
    {ordered_position:2,loaded:false}, 
 
    {ordered_position:4,loaded:true}, 
 
    {ordered_position:8,loaded:false}], 
 
optionnalSections = [{ordered_position:3,loaded:false}]; 
 

 
var arr = mandatorySections.concat(optionnalSections).filter(function(item) { 
 
return !item.loaded; 
 
}).sort(function(a,b) { 
 
return a.ordered_position - b.ordered_position}) 
 

 
console.log(arr);

編輯:說明:

Concat加入陣列,filter通過檢查loaded標誌取出裝物品,並sort排序通過ordered_position

2

你可以Concat的項目,過濾並對結果集進行排序。

var mandatorySections = [{ ordered_position: 0, loaded: false }, { ordered_position: 2, loaded: false }, { ordered_position: 4, loaded: true }, { ordered_position: 8, loaded: false }], 
 
    optionnalSections = [{ ordered_position: 3, loaded: false }], 
 
    result = mandatorySections. 
 
     concat(optionnalSections). 
 
     filter(function (a) { return !a.loaded; }). 
 
     sort(function (a, b) { return a.ordered_position - b.ordered_position; }); 
 

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

+0

確實很棒。 –

2

您可以通過3種內置陣列功能實現此目的:concat,filtersort

注:我已經建立了這個代碼,假設你想改變過濾和排序的條件。因此,我將所有功能分成了不同的功能,但如果條件總是相同,則可以簡化主功能。

首先,你要過濾。因此,我們需要一個函數,當它符合你想保持你不想要的那些元素和假的條件返回true:

/** 
* Function defined to decide how to filter our objects. 
* @param {!Object} element - Object to filter. 
* @return {boolean} Whether it meets all the conditions. 
*/ 
var filterFunction = function(element) { 
    // Define all conditions by which to filter. 
    return element.loaded === false; 
    /* 
    * Other example: return objects whose attributes meet these conditions: 
    * ordered_position lesser than five 
    * AND loaded === true; 
    * 
    * return element.ordered_position <= 5 && element.loaded; 
    */ 
} 

按照你的例子,這個人將只包含元素其加載的屬性爲false。您可以添加更多條件或根據您的意願對每次執行進行更改。

然後,我們需要一個分選功能:

/** 
* Function to order objects by parameters. 
* @param {Object} a - First object in comparison. 
* @param {Object} b - Second object in comparison. 
* @return {number} Order: negative (< 0), positive (> 0) or neutral (0). 
*/ 
var orderFunction = function(a, b) { 
    // Order by ordered_position ASC. 
    return a.ordered_position - b.ordered_position; 
} 

這一個訂單由ordered_position ASC如同先前的值(A)>下一個值(b)中,它返回一個正值。您可以通過反轉參數來執行DESC,或者通過多個參數構建您自己的排序函數來排序字符串或甚至排序。

最後,我們可以放在一起我們的工作流程:

/** 
* Gets all the arrays, filters by one parameter, 
* returns data ordered by another parameter as an Array. 
* @param {!Array<Array>} arrays - Group of arrays to search in. 
* @param {Function} opt_filterBy - Function with filtering conditions. 
* @param {Function} opt_orderBy - Parameter for which to order. 
* @return {Array<Object>} Merged, filtered and sorted Array. 
*/ 
var arrayFilter = function (arrays, opt_filterBy, opt_orderBy) { 
    // Merge all arrays in one. 
    var mergedArray = [].concat.apply([], arrays); 
    // Iterate array to remove elements. 
    if (opt_filterBy) var filteredArray = mergedArray.filter(opt_filterBy); 
    // Sort array by parameter. 
    if (opt_orderBy) filteredArray = filteredArray.sort(opt_orderBy); 
    // return Merged, filtered and sorted Array. 
    return filteredArray; 
} 

該函數有3個參數:您的數組的數組(所有要合併的陣列,篩選和排序)功能來過濾(可選,我們定義的第一個)和一個排序函數(可選,我們定義的第二個函數)。

若要將此到你的情況,你可以運行這樣的:

var mandatorySections = [ 
    {ordered_position:0,loaded:false}, 
    {ordered_position:2,loaded:false}, 
    {ordered_position:4,loaded:true}, 
    {ordered_position:8,loaded:false} 
]; 

var optionnalSections = [ 
    {ordered_position:3,loaded:false} 
]; 

arrayFilter(
    [mandatorySections, optionnalSections], 
    filterFunction, 
    orderFunction 
); 

/** 
 
* Function defined to decide how to filter our objects. 
 
* @param {!Object} element - Object to filter. 
 
* @return {boolean} Whether it meets all the conditions. 
 
*/ 
 
var filterFunction = function(element) { 
 
    // Define all conditions by which to filter. 
 
    return element.loaded === false; 
 
    /* 
 
    * Other example: return objects whose attributes meet these conditions: 
 
    * ordered_position lesser than five 
 
    * AND loaded === true; 
 
    * 
 
    * return element.ordered_position <= 5 && element.loaded; 
 
    */ 
 
} 
 

 

 
/** 
 
* Function to order objects by parameters. 
 
* @param {Object} a - First object in comparison. 
 
* @param {Object} b - Second object in comparison. 
 
* @return {number} Order: negative (< 0), positive (> 0) or neutral (0). 
 
*/ 
 
var orderFunction = function(a, b) { 
 
    // Order by ordered_position ASC. 
 
    return a.ordered_position - b.ordered_position; 
 
} 
 

 

 
/** 
 
* Gets all the arrays, filters by one parameter, 
 
* returns data ordered by another parameter as an Array. 
 
* @param {!Array<Array>} arrays - Group of arrays to search in. 
 
* @param {Function} opt_filterBy - Function with filtering conditions. 
 
* @param {Function} opt_orderBy - Parameter for which to order. 
 
* @return {Array<Object>} Merged, filtered and sorted Array. 
 
*/ 
 
var arrayFilter = function (arrays, opt_filterBy, opt_orderBy) { 
 
    // Merge all arrays in one. 
 
    var mergedArray = [].concat.apply([], arrays); 
 
    // Iterate array to remove elements. 
 
    if (opt_filterBy) var filteredArray = mergedArray.filter(opt_filterBy); 
 
    // Sort array by parameter. 
 
    if (opt_orderBy) filteredArray = filteredArray.sort(opt_orderBy); 
 
    // return Merged, filtered and sorted Array. 
 
    return filteredArray; 
 
} 
 

 

 

 

 
/* Execution of code. */ 
 
var mandatorySections = [ 
 
    {ordered_position:0,loaded:false}, 
 
    {ordered_position:2,loaded:false}, 
 
    {ordered_position:4,loaded:true}, 
 
    {ordered_position:8,loaded:false} 
 
]; 
 

 
var optionnalSections = [ 
 
    {ordered_position:3,loaded:false} 
 
]; 
 

 
var result = arrayFilter(
 
    [mandatorySections, optionnalSections], 
 
    filterFunction, 
 
    orderFunction 
 
); 
 

 
console.log(result);

我試圖保持這個一般的,可擴展的,但你可以很容易地簡化如果代碼你的用例更基本。

我希望這會有所幫助。