第1引数「配列」のみの時は、入れ子の配列を単純な配列(入れ子なし)にしてくれる。第2引数で「true」が指定されている時は、一番浅い配列だけを解消する。
■使用例
var arr = [1, [2], [3, [ [4] ] ] ];
// re = [ 1, 2, 3, 4 ];
var re = _.flatten( arr );
var arr = [1, [2], [3, [ [4] ] ] ];
// re2 = [1,2,3,[ [4] ] ];
var re2 = _.flatten( arr, true);
■内部構造
_.flatten = function(array, shallow) {
return flatten(array, shallow, false);
};
// _.flatten() の引数は以下の関数に代入される。
var flatten = function(input, shallow, strict, startIndex) {
var output = [], idx = 0;
// for( var i = 0, length = array.length; i < length; i++ ){
for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
// 配列の各値。
var value = input[i];
// 各値が配列、arguments である場合
if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
// 第2引数が「true」指定されている時は再帰処理しない。1回しか配列を解消しない。
if (!shallow) value = flatten(value, shallow, strict);
var j = 0, len = value.length;
output.length += len;
// 各値が配列でない時、 j = 0 < len = 0 なのでこの処理は行われない。
while (j < len) {
output[idx++] = value[j++];
}
} else if (!strict) {
// 各値が結果出力用の配列に入れられる。
output[idx++] = value;
}
}
return output;
};