如何获取数组及其子数组中的所有值
如何获取数组及其子数组中的所有值
我正在尝试构建一个函数,该函数将应用于一个数组,并提取所有不是数组的值。
对于那些是数组的值,它将再次执行相同的过程,直到将第一个数组、其子数组、子数组的子数组等所有值放入一个单独的数组中。
我面临的问题是,我事先不知道每个数组将有多少个子数组等等。
我尝试过使用下面所示的forEach()
,但正如我上面所说的,子数组的数量和值在事先是未知的。我相信一些循环或甚至递归会有帮助,但我无法在脑海中使其工作。
function extract(value) { var result = [], isArray = function(value) { return value.constructor === Array; } if (isArray(value)) { value.forEach(function(each) { if (!isArray(each)) result.push(each); else { each.forEach(function(j) { if (!isArray(each)) result.push(each); else... // 与上面相同 }); } }); } return result; }
我相信使用each = each[i]
就像我在DOM中寻找子元素一样会有帮助,但我不确定如何设置这种情况下的while
循环及终止条件应该是什么。
期望的结果:
var array = [["a", 2, [3, "mn"], "bu"], "la", [12, 34, "ab"]]; // 仅为示例 var result = extract(array); // 输出:["a", 2, 3, "mn", "bu", "la", 12, 34, "ab"]
如何修复我当前的代码以实现上述期望的结果?
问题的原因是作者想要从一个包含子数组的数组中获取所有的值,但不知道如何实现。解决方法是使用递归reduce函数。
作者给出了一个解决方法的代码示例,使用了一个名为flatten的函数。该函数接受一个数组作为参数,并使用reduce函数对数组进行迭代。在每次迭代中,reduce函数将当前元素与累加器进行拼接。如果当前元素是一个数组,则递归调用flatten函数来获取其所有值,并将其拼接到累加器中。最后,flatten函数返回拼接后的数组。
在代码示例中,作者定义了一个包含子数组的数组arr。然后,调用flatten函数来获取arr中的所有值,并将结果存储在变量result中。最后,使用console.log打印出结果。
读者在评论中提到了reduce函数的兼容性问题,作者回复称reduce函数适用于IE9+。评论者表示感谢,并表示这个解决方法可能对将来的某些人有帮助。
问题的原因:从一个数组及其子数组中获取所有的值。
解决方法:使用递归来实现。定义一个函数extract,接受两个参数array和newarray。如果newarray不存在,则将其初始化为空数组。遍历array,如果当前元素的类型是数组,则递归调用extract函数,将当前元素作为新的array参数传入。否则,将当前元素添加到newarray中。最后,返回newarray。
在给定的示例中,定义了一个数组array。调用extract函数,并将array作为参数传入。将返回的结果赋值给newarray。最后,打印newarray的值。
运行结果为:["a", 2, 3, "mn", "bu", "la", 12, 34, "ab"]。