您可以通過3種內置陣列功能實現此目的:concat,filter和sort。
注:我已經建立了這個代碼,假設你想改變過濾和排序的條件。因此,我將所有功能分成了不同的功能,但如果條件總是相同,則可以簡化主功能。
首先,你要過濾。因此,我們需要一個函數,當它符合你想保持你不想要的那些元素和假的條件返回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);
我試圖保持這個一般的,可擴展的,但你可以很容易地簡化如果代碼你的用例更基本。
我希望這會有所幫助。
你已經描述了你想要什麼,但沒有顯示你所嘗試的或你對過程有什麼具體問題。 – csmckelvey
合併兩個數組,按「已加載」鍵過濾,然後按「ordered_position」鍵進行排序。你不知道該怎麼做? – JJJ