多重配列を、指定したセルの箇所だけ展開させたいです。
多重配列のフラット化([ 'a', [ 'b', [ 'c', 'd' ], 'e' ], 'f' ]
=> [ 'a', 'b', 'c', 'd', 'e', 'f' ]
)ではなく、
多重配列を、指定したセルの箇所だけ展開させたいです。どうすればいいですか?
具体的には、
Start
//元のテーブル
[
['1','b','c',['d1','d2'],['e1','e2']],
['2','b',['c1','c2'],['d1','d2'],'e'],
['3',['b1','b2'],'c',['d1','d2'],'e'],
['4',['b1','b2','b3','b4'],'c','d','e']
]
//セルの指定
[ false, true, false, true ] //例えば2つ目と4つ目のセル(この例だとbのセルとdのセル)だけ展開する指定
Goal
//展開後のテーブル
[
['1','b','c','d1',['e1','e2']],
['1','b','c','d2',['e1','e2']],
['2','b',['c1','c2'],'d1','e'],
['2','b',['c1','c2'],'d2','e'],
['3','b1','c','d1','e'],
['3','b1','c','d2','e'],
['3','b2','c','d1','e'],
['3','b2','c','d2','e'],
['4','b1','c','d','e'],
['4','b2','c','d','e'],
['4','b3','c','d','e'],
['4','b4','c','d','e']
]
みたいな感じです。
Arrayのメソッドチェーンの途中で使いたいのでreduce等のコールバック関数にしたいです。
↓うまくいかなかったやつ(というか何をやっているのかわからなくなってきたやつ)の中で一番ゴールに近かったやつ
var expand = function(targets) {
return function(newTable, oldRow) {
//
return newTable.concat(targets.reduce(function(rows, target, i) {
return target ? rows.concat(rows.reduce(function(newRows, row) {
return [].concat(row[ i ]).map(function(cell) {
var newRow = row.slice()
newRow[ i ] = cell
return newRow
})
}, [])) : rows
}, [ oldRow.slice() ]))
//
}
}
var result = [
['1','b','c',['d1','d2'],['e1','e2']],
['2','b',['c1','c2'],['d1','d2'],'e'],
['3',['b1','b2'],'c',['d1','d2'],'e'],
['4',['b1','b2','b3','b4'],'c','d','e']
].reduce(expand([ false, true, false, true ]), [])
console.log(result)