用于递归展平结果的 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
(据说存储递归调用的结果 return 时,出了什么问题)。如果我们要使用以下代码段更改 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
函数,这会将 returned 数组添加到结果中,但由于某些原因并非如此。
关于这个任务的问题被问到了,比如,但是那些与扁平化算法部分有关的问题,这里没有被问到。
我仍然看不出究竟是什么导致了差异的答案。这很可能是我在麻烦中或由于我有限的经验而忽略的事情。抱歉,如果是这样的话。
Array#concat
returns 一个包含结果的新数组。
The concat()
method returns a new array comprised of the array on which it is called joined with the array(s) and/or value(s) provided as arguments.
所以你需要分配结果:
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 );
美好的一天!
任务是获取平面版本的数组,其中可能包含一定数量的嵌套数组以及其他元素。预期输入 [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
(据说存储递归调用的结果 return 时,出了什么问题)。如果我们要使用以下代码段更改 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
函数,这会将 returned 数组添加到结果中,但由于某些原因并非如此。
关于这个任务的问题被问到了,比如
Array#concat
returns 一个包含结果的新数组。
The
concat()
method returns a new array comprised of the array on which it is called joined with the array(s) and/or value(s) provided as arguments.
所以你需要分配结果:
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 );