我正在嘗試根據必須滿足的某些條件來組織我擁有的陣列。
我有 3 種陣列: 人員陣列
var array1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
日期陣列
var array2 = ["date1","date2","date3","date4"]
對于array2中的每個值,我都有對應的單獨陣列(或二維陣列,不知道什么是最好的老實說)
var date1Group1 = [1,6,7,8]
var date1Group2 = [4,5,9]
var date1Group3 = [6,17,15,3,11]
或者
var date1Groups = [[1,6,7,8],[4,5,9],[6,17,15,3,11]]
每個日期都有自己對應的組陣列
var date2Groups = [...]
...
var date4Groups = [...]
我需要做的是將array1的值按比例分配到一個新陣列中,對應于它被array2.length分割。在這種特殊情況下,因為:
array1.length = 18
array2.length = 4
例如,我可以有 2 個 5 個值的子陣列的 1 個二維陣列和 4 個值的 2 個子陣列,或者每個組有 4 個單獨的陣列:
var arrayResultDate = [[v1,v2,v3,v4,v5],[v1,v2,v3,v4,v5],[v1,v2,v3,v4],[v1,v2,v3,v4]]
或者
var arrayResultDate1 = [v1,v2,v3,v4,v5]
var arrayResultDate2 = [v1,v2,v3,v4,v5]
var arrayResultDate3 = [v1,v2,v3,v4]
var arrayResultDate4 = [v1,v2,v3,v4]
為了分發它們,我需要檢查分配給每個新陣列的值是否在其對應日期的同一組中重復。例如:
//This is valid be because no value is repeated in any of the groups for date1
arrayResultDate1 = [2,4,7,14,18]
//This is NOT VALID because values 6 and 8 are in date1Group1 / date1Groups[0]
arrayResultDate1 = [3,6,8,18,12]
我想做的是首先從array1 [0]到array1 [3],從arrayResultDate1到arrayResultDate4(每個1)
arrayResultDate1.push(array1[0])
arrayResultDate2.push(array1[1])
arrayResultDate3.push(array1[2])
arrayResultDate4.push(array1[3])
或者
arrayResultDate[0].push(array1[0])
arrayResultDate[1].push(array1[1])
arrayResultDate[2].push(array1[2])
arrayResultDate[3].push(array1[3])
然后使用回圈遍歷 array1 中的其余值,并檢查每個結果陣列中是否滿足條件。如果滿足條件,則對陣列進行處理,如果不滿足,則進行下一個。
條件: 如果嘗試將array1[x]分配給arrayResultDate1,請檢查值 array1[x]和arrayResultDate1中的值是否同時在date1的任何組中:
date1Group1 = [1,6,7,8]
date1Group2 = [4,5,9]
date1Group3 = [6,17,15,3,11]
如果所述值在任何組中不同時,則
arrayResultDate1.push(array1[x])
如果值在至少一個組中,則繼續下一個結果陣列并檢查它的相應組(在這種情況下,它將是arrayResultDate2所以date2Group1、date2Group2等)
由于我認為需要的其他回圈中的回圈,我無法正確組織代碼。我希望這更清楚一點。如果仍然沒有,請告訴我。
uj5u.com熱心網友回復:
使用Array.filter()and Array.sort(),像這樣:
function test() {
const people = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,];
const criteria = [
{ label: 'date1', mutuallyExclusive: [[1, 6, 7, 8,], [4, 5, 9,], [6, 17, 15, 3, 11,],], },
{ label: 'date2', mutuallyExclusive: [[1, 6,],], },
{ label: 'date3', mutuallyExclusive: [[1, 7,],], },
{ label: 'date4', mutuallyExclusive: [[1, 8,],], },
];
const assignments = distributeObjectsToGroups(people, criteria);
console.log(assignments);
}
/**
* Distributes objects to groups observing multiple mutual exclusivity criteria.
*
* Processes each object in turn in the order they appear in the objects array.
* Attempts to make result groups approximately equal size by placing each object
* in the currently smallest group.
* Puts objects that do not fit in any group in an 'unassigned' group.
*
* @param {Object[]} objects The objects to place into groups, as in [1, 2, 3, 4,].
* @param {Object[]} groups An array of group labels and mutual exclusivity criteria.
* Each criteria is a 2D array that lists objects that should be
* mutually exclusive and not appear in the same result group.
* [
* { label: 'date1', mutuallyExclusive: [[1, 2, 3,], [2, 4,]], },
* { label: 'date2', mutuallyExclusive: [[2, 3,],], },
* ]
* @return {Object} The group labels and objects placed in each group.
* { date1: [1, 4,], date2: [2,], unassigned: [3,], }
*/
function distributeObjectsToGroups(objects, groups) {
// version 1.1, written by --Hyde, 3 November 2022
// - see https://stackoverflow.com/a/74294212/13045193
const result = { unassigned: [], };
groups.forEach(group => result[group.label] = []);
objects.forEach(object => {
const suitable = groups
.filter(group =>
!group.mutuallyExclusive.some(exclude =>
exclude.includes(object) &&
result[group.label].some(object2 => exclude.includes(object2)))
)
.sort((a, b) => result[a.label].length - result[b.label].length);
if (suitable.length) {
result[suitable[0].label].push(object);
return;
}
result.unassigned.push(object);
});
return result;
}
測驗運行記錄以下內容:
{
date1: [1, 5, 10, 13, 17],
date2: [2, 6, 9, 14, 18],
date3: [3, 7, 11, 15],
date4: [4, 8, 12, 16],
unassigned: [],
}
請參閱Stack Overflow 上的 Apps 腳本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/526301.html
上一篇:查找兩個向量之間的多個重合
