【问题标题】:Flatten array in javascript [duplicate]在javascript中展平数组[重复]
【发布时间】: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


【解决方案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);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-30
          • 2019-11-24
          • 2017-07-20
          • 2018-11-13
          • 2021-06-03
          • 2016-12-26
          • 2019-11-16
          相关资源
          最近更新 更多