【发布时间】:2021-10-16 09:23:40
【问题描述】:
我是递归新手。我可以展平一个数组并作为普通数组返回,但是如果我想展平数组并将其存储在一个对象中并返回值,由于某种原因我丢失了前一个结果的值,如果你可以帮助我。 PS:我可以通过每次迭代将结果作为参数发送来做到这一点,但我想这样做......
const flatten = (nums) => {
result = {
number: [],
};
console.log(result);
for (let num of nums) {
if (Array.isArray(num)) {
result = {
...result,
...flatten(num),
};
} else if (typeof num === "number") {
result = { ...result, number: [...result.number, num] };
}
}
return result;
};
console.log(flatten([[1, 2], [3, [6, [1, 2, 3]], [4, [5]]], [1]]));
我什至尝试了以下方法,我知道我犯了一些错误,只是我无法找到确切的位置
const flatten = (nums) => {
return nums.reduce(
(acc, ele) => {
if (Array.isArray(ele)) {
acc = { ...acc, num: [...flatten(ele)] };
} else {
acc = { ...acc, num: [...acc.num, ele] };
}
return acc;
},
{ num: [] }
);
};
预期输出:-
result={
number:[1,2,3,6,1,2,3,4,5,1]
}
或
{
number:[1,2,3,6,1,2,3,4,5,1]
}
【问题讨论】:
-
JS 将其作为内置函数,
array.flat(Infinity)。你期待什么结果?如果您希望它作为对象的属性,{number: array.flat(Infinity)}。你当前的代码声明了一个全局的result——如果你是"use strict",你会得到一个错误。 -
我尝试手动操作,没有任何内置功能
-
然后手写一个normal flatten,在调用者中添加对象。对函数中的对象进行硬编码是糟糕的设计,因为它失去了一般用途,而且无缘无故地使代码复杂化。见SRP
标签: javascript arrays object recursion