JS数组连接的结果递归扁平化
JS array concatenation for results of recursive flattening
大家好!
任务将是获得数组的平面版本,其中可能包括一些嵌套数组以及其他元素。对于输入[1, [2], [3, [[4]]]]
,输出[1, 2, 3, 4]
期望。FreeCodeCamp剧透警报。自然,递归解决方案就会浮现在脑海中,例如:
function steamrollArray(arr) {
var result = [];
for(var i = 0; i < arr.length; i++){
//part of interest
if (Array.isArray(arr[i])){
var nestedElements = steamrollArray(arr[i]);
for(var j = 0; j < nestedElements.length; j ++){
result.push(nestedElements[j]);
}
//</part of interest>.
} else {
console.log("pushing: " + arr[i]);
result.push(arr[i]);
}
}
return result;
}
它做它的事情。样本运行的结果将是:
pushing: 1
pushing: 2
pushing: 3
pushing: 4
[1, 2, 3, 4]
问题是:当我们使用concat添加nestedElements
(应该存储递归调用的返回结果)时,出了什么问题?如果我们要更改for
循环中的第一个if{}
块(标记为感兴趣的一部分),请使用下面的代码片段:
if (Array.isArray(arr[i])){
var nestedElements = steamrollArray(arr[i]);
result.concat(nestedElements);
} else {
我们将观察到以下结果:
pushing: 1
pushing: 2
pushing: 3
pushing: 4
[1]
我的理解是将每个递归调用的结果传递给concat
函数,它将返回的数组添加到结果中,但由于某种原因,情况并非如此。有人问了关于这个任务的问题,就像这个一样,但那些与平坦化算法部分有关的问题,在这里没有被质疑。我仍然找不到答案,究竟是什么导致了这种差异。这很可能是我在麻烦中忽视的东西,或者是我经验有限的结果。如果是这样的话,我很抱歉。
Array#concat
返回一个包含结果的新数组。
concat()
方法返回一个新数组,该数组由调用该方法的数组与作为参数提供的数组和/或值连接而成。
你需要赋值结果:
result = result.concat(nestedElements);
// ^^^^^^ assignment
我对接受的答案感到困惑,因为它只能连接两个数组。你想要的嵌套数组实际上是:
var flatArray = [].concat.apply([], yourNestedArray);
这是我的功能
function _recursive_array_flat( ...args )
{
var _ret_array = [];
for( _arg of args )
{
if ( _arg instanceof Array )
{
if ( _arg.length > 0 ) // work with consistent elements only
_ret_array = _ret_array.concat( _recursive_array_flat( ..._arg ) );
}
else _ret_array.push( _arg );
}
return _ret_array;
}
var _ret = _recursive_array_flat( [0], 1,2,3, [ 4,5,6, [ 7,8,9 ] ] );
console.log( _ret );
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 有没有一种方法可以在Javascript中进行可变递归currying
- 如何对不同的表递归使用以下代码
- 将jQuery对象传递到setTimeout递归函数中
- 扁平化多个嵌套数组的数组而不带递归 - javascript
- 根据递归ul中的输入获取一个表单的序列化数组
- Javascript:在递归函数中初始化变量一次(如静态变量)
- 使用LESS对同名的内部类进行递归样式化
- 递归平坦化数组(不循环)
- JS数组连接的结果递归扁平化