yxf*_*xmx 13 javascript arrays recursion
我正在练习并尝试编写一个递归数组展平函数.代码在这里:
function flatten() {
var flat = [];
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] instanceof Array) {
flat.push(flatten(arguments[i]));
}
flat.push(arguments[i]);
}
return flat;
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我传递一个数组或嵌套数组,我得到"超出最大调用堆栈大小"错误.我究竟做错了什么?
Aru*_*hny 21
问题是你如何传递数组的处理,如果值是一个数组,那么你一直在调用它导致无限循环
function flatten() {
var flat = [];
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] instanceof Array) {
flat.push.apply(flat, flatten.apply(this, arguments[i]));
} else {
flat.push(arguments[i]);
}
}
return flat;
}
Run Code Online (Sandbox Code Playgroud)
演示:小提琴
这是一个更现代的版本:
function flatten(items) {
const flat = [];
items.forEach(item => {
if (Array.isArray(item)) {
flat.push(...flatten(item));
} else {
flat.push(item);
}
});
return flat;
}
Run Code Online (Sandbox Code Playgroud)
flat()
:const array = [1, 1, [2, 2], [[3, [4], 3], 2]]
// All layers
array.flat(Infinity) // [1, 1, 2, 2, 3, 4, 3, 2]
// Varying depths
array.flat() // [1, 1, 2, 2, Array(3), 2]
array.flat(2) // [1, 1, 2, 2, 3, Array(1), 3, 2]
array.flat().flat() // [1, 1, 2, 2, 3, Array(1), 3, 2]
array.flat(3) // [1, 1, 2, 2, 3, 4, 3, 2]
array.flat().flat().flat() // [1, 1, 2, 2, 3, 4, 3, 2]
Run Code Online (Sandbox Code Playgroud)
我可以使用吗- 92% 2020 年 12 月
小智 7
[...arr.toString().split(",")]
Run Code Online (Sandbox Code Playgroud)
使用 的toString()
方法Object
。使用扩展运算符(...)
创建一个字符串数组并将其拆分为","
.
例子:
let arr =[["1","2"],[[[3]]]]; // output : ["1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)
如果项目是数组,我们只需将所有剩余的项目添加到该数组中
function flatten(array, result) {
if (array.length === 0) {
return result
}
var head = array[0]
var rest = array.slice(1)
if (Array.isArray(head)) {
return flatten(head.concat(rest), result)
}
result.push(head)
return flatten(rest, result)
}
console.log(flatten([], []))
console.log(flatten([1], []))
console.log(flatten([1,2,3], []))
console.log(flatten([1,2,[3,4]], []))
console.log(flatten([1,2,[3,[4,5,6]]], []))
console.log(flatten([[1,2,3],[4,5,6]], []))
console.log(flatten([[1,2,3],[[4,5],6,7]], []))
console.log(flatten([[1,2,3],[[4,5],6,[7,8,9]]], []))
Run Code Online (Sandbox Code Playgroud)
一个 Haskelesque 的方法......
function flatArray([x,...xs]){
return x !== undefined ? [...Array.isArray(x) ? flatArray(x) : [x],...flatArray(xs)]
: [];
}
var na = [[1,2],[3,[4,5]],[6,7,[[[8],9]]],10],
fa = flatArray(na);
console.log(fa);
Run Code Online (Sandbox Code Playgroud)
所以我认为上面的代码片段可以通过适当的缩进更容易理解;
function flatArray([x,...xs]){
return x !== undefined ? [ ...Array.isArray(x) ? flatArray(x)
: [x]
, ...flatArray(xs)
]
: [];
}
var na = [[1,2],[3,[4,5]],[6,7,[[[8],9]]],10],
fa = flatArray(na);
console.log(fa);
Run Code Online (Sandbox Code Playgroud)