在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中展平数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中展平数组 [重复]

在Ruby中递归地展平数组[重复]

展平多维数组连接键[重复]

Javascript递归数组展平

Javascript函数没有正确展平数组

递归地展平数组(不循环)javascript