在javascript中展平数组[重复]
Posted
技术标签:
【中文标题】在javascript中展平数组[重复]【英文标题】:Flatten array in javascript [duplicate] 【发布时间】: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
【参考方案1】:
您也可以使用带有递归的 array.reduce() 方法来做到这一点。
const items = [1, 2, 3, [5, 5], [[8, 9]], [99], 125];
function flatArray(items)
return items.reduce((arrayData, element) =>
if (Array.isArray(element))
arrayData = [...arrayData, ...flatArray(element)];
else
arrayData = [...arrayData, element];
return arrayData;
, []);
;
console.log(flatArray(items));
// [1, 2, 3, 5, 5, 8, 9, 99, 125]
const result =
number: flatArray(items),
;
【讨论】:
嘿,我一直在尝试以这种方式将 .reduce fun 的初始值指定为 num: [] 而不是普通数组,并继续将值存储在 num 数组中,我试过了,但我失去了以前的价值 做简单的 const 结果 = number: flatArray(items), ;【参考方案2】:我们也可以实现这种方式,请在开发者 mozilla 网站flat查看平面方法
const arr = [1, 2, [3, 4, [5, 6]]];
function flatDeep(arr, d = 1)
return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), [])
: arr.slice();
;
flatDeep(arr, Infinity);
【讨论】:
【参考方案3】:试试这个
var a = [[1, 2], [3, [6, [1, 2, 3]], [4, [5]]], [1]];
console.log(a.flat(3))
【讨论】:
【参考方案4】:您的参数应该是一个数字数组,但是当您递归调用该方法时,您将给它一个result
对象。要使用递归,您需要具有一致的方法签名。
如果你想知道之前的输入,你需要传递一个包含之前数组的对象。
您可能想尝试使用 Java 等静态类型语言学习算法。对于这样的简单错误,javascript 是非常无情的。
【讨论】:
【参考方案5】:const array = [[1, 2], [3, [6, [1, 2, 3]], [4, [5]]], [1]];
const output = number: array.flat(3);
console.log(output);
【讨论】:
以上是关于在javascript中展平数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章