問題
const combine = [1, 2, 4, 5, 6];
const define = {
1: [1],
2: [2],
3: [3],
4: [1, 2, 4],
5: [5],
6: [0, 6]
}
このデータから
[
[1, 2, 1, 5, 0],
[1, 2, 2, 5, 0],
[1, 2, 4, 5, 0],
[1, 2, 1, 5, 6],
[1, 2, 2, 5, 6],
[1, 2, 4, 5, 6]
]
この配列を生成する(順不問)
ルール
combine は define の key を AND で接続するという意味の配列
define は 自身の番号を OR で 接続するという意味の配列
簡単な例1
const combine = [1, 2];
const define = {
1: [1],
2: [2]
}
このデータなら
[
[1, 2]
]
簡単な例2
const combine = [1, 2];
const define = {
1: [1],
2: [2, 3]
}
このデータなら
[
[1, 2],
[1, 3]
]
俺的順列の生成
const combine = [1, 2, 4, 5, 6];
const define = {
1: [1],
2: [2],
3: [3],
4: [1, 2, 4],
5: [5],
6: [0, 6]
}
let result = new Array([]);
for (let i = 0; i < combine.length; i++) {
let defNo = combine[i];
if (!(defNo in define)) continue; //なければ飛ばす
let def = define[defNo];
let defKeys = Object.keys(def);
// defineNo が複数あった場合に配列を複製する
if (defKeys.length > 1) {
let count: number = result.length;
for (let i = 0; i < count; i++) {
let base = result[i];
for (let j = 1; j < defKeys.length; j++) {
result.push(base.slice(0, base.length));
}
}
}
// 組み合わせにケース番号を登録する
let j: number = 0;
for (let i = 0; i < result.length; i++) {
let caseNo: string = def[defKeys[j]];
result[i].push(caseNo);
j++;
if (j == defKeys.length) j = 0;
}
}
console.log(result);
いろいろ 気に入らない
特にここ
let j: number = 0;
for (let i = 0; i < result.length; i++) {
let caseNo: string = def[defKeys[j]];
result[i].push(caseNo);
j++;
if (j == defKeys.length) j = 0;
}
j をつかった defKeys[j] は
0 6 0 6 0 6 0 6
というふうに defineの数列を 繰り返してほしいのだが、もっとうまい方法があると思う
メモ
とりあえずこれで実装した
メモ代わりに ここに残した