- это правильный способ сделать глубокое выравнивание с такой плоскостью или есть последствия.?
Никаких последствий, Array#flat(Infinity)
в порядке .Просто проблема с браузером / обратной совместимостью.
Я не был уверен, что spec определяет, как обращаться с переданным depth
, и поэтому Infinity
является безопасным значением для всехвесь браузер;Короче говоря, он определен и безопасен в использовании.
Но у меня есть проблема с вашим запасным кодом.Используя Array#concat()
, вы создаете много промежуточных (и ненужных) массивов.
Лучшим подходом будет:
var exampleArray = [
[1, 2, 3, 4],
[1, 2, [1, 2, 3]],
[1, 2, 3, 4, 5, [1, 2, 3, 4, [1, 2, 3, 4]]]
];
function _flatten(acc, value) {
if (Array.isArray(value)) {
return value.reduce(_flatten, acc);
}
acc.push(value);
return acc;
}
function flatten(array) {
return array.reduce(_flatten, []);
}
console.log(exampleArray.map(e => flatten(e).length));
//or since you already named your function `findArrayLength`
function _findArrayLength(count, value) {
return Array.isArray(value) ? value.reduce(_findArrayLength, count) : count + 1;
}
function findArrayLength(array) {
return array.reduce(_findArrayLength, 0);
}
console.log(exampleArray.map(findArrayLength));
.as-console-wrapper{top:0;max-height:100%!important}
Или более общая реализация
var exampleArray = [
[1, 2, 3, 4],
[1, 2, [1, 2, 3]],
[1, 2, 3, 4, 5, [1, 2, 3, 4, [1, 2, 3, 4]]]
];
function reduceRecursive(fn, init) {
function _(acc, value, index, array) {
return Array.isArray(value) ? value.reduce(_, acc) : fn(acc, value, index, array);
}
return function(array){
return array.reduce(_, typeof init === "function" ? init() : init);
}
}
var flatten = reduceRecursive(function(result, value) {
result.push(value);
return result;
}, Array);
console.log(exampleArray.map(e => flatten(e).length));
var findArrayLength = reduceRecursive(function(count) {
return count + 1;
}, 0);
console.log(exampleArray.map(findArrayLength));
.as-console-wrapper{top:0;max-height:100%!important}