【问题标题】:How to flatten/reduce only the deepest or otherwise specicified level of an Nth-dimensional array如何仅展平/减少第 N 维数组的最深或其他指定级别
【发布时间】:2020-11-06 08:55:25
【问题描述】:

假设一个 N 维数组,例如。

const array = [
  "1",
  ["2","2"],
  [["3","3"],["3","3"]],
  [
    [
      [["4","4"],"3"],
      [["4","4"],"3"]
    ],
  ],
  [["3","3"],["3","3"]],
  ["2","2"],
  "1"
];

我只能找到从索引的浅端向上展平数组的方法,但我需要展平/减少或仅处理最深(或任意)的索引级别。

当运行最深层次时,我正在寻找一个数组输出类似于

array = [
  "1",
  ["2","2"],
  [["3","3"],["3","3"]],
  [
    [
      ["4,4","3"],
      ["4,4","3"]
    ],
  ],
  [["3","3"],["3","3"]],
  ["2","2"],
  "1"
];

我找不到不垃圾的解决方案...(过于复杂/令人难以置信的混乱) 任何帮助将不胜感激

【问题讨论】:

  • 只要求我们找到解决方案是不够的;您需要向我们提供您自己的尝试来解决问题,然后我们可以提供帮助。
  • 你也应该发布你的预期结果。
  • 由于这个问题很有趣,很遗憾你没有尝试解决它。开始here,然后如果遇到困难,请提出问题。
  • “垃圾”在这里非常主观。你发现的东西有什么垃圾?太长?性能不够?也许发布链接到您已经访问过但对您没有帮助的 SO 问题。
  • 感谢您的快速回复,很抱歉我没有包括任何工作,我已经为此工作了好几天了。下次我肯定会添加一个框架以及预期的结果。第一次发帖紧张...

标签: javascript arrays multidimensional-array flatten


【解决方案1】:

您可以创建一个函数来获取您想要展平的数据和级别,并且只会展平该级别。然后要获得最后一个级别,您可以创建另一个函数。

const array = ["1",["2","2"],[["3","3"],["3","3"]],[[[["4","4"],"3"],[["4","4"],"3"]],[["",""],["",""]]],[["3","3"],["3","3"]],["2","2"],"1"];

function lastLvl(data, lvl = 0) {
  return data.reduce((r, e) => {
    if (lvl > r) r = lvl

    if (Array.isArray(e)) {
      const nlvl = lastLvl(e, lvl + 1);
      if (nlvl > r) r = nlvl
    }

    return r
  }, 0)
}

function flattenLvl(data, lvl, clvl = 1) {
  return data.reduce((r, e) => {
    if (Array.isArray(e)) {
      const nested = flattenLvl(e, lvl, clvl + 1);
      if (clvl == lvl) r.push(...nested);
      else r.push(nested)
    } else {
      r.push(e)
    }

    return r;
  }, [])
}

const lvl = lastLvl(array)
const result = flattenLvl(array, lvl)
console.log(result)

【讨论】:

  • 感谢您的快速回复,很抱歉没有包括我的预期输出。我希望减少到最低元素并更新原始数组,以便在运行最深索引后看起来像这样\r\n array = [ "1", ["2","2"], [["3 ","3"],["3","3"]], [ [["4,4","3"], ["4,4","3"] ], [["", ""], ["",""]] ], [["3","3"],["3","3"]], ["2","2"], "1"] ;
  • 成功了,谢谢。明天我将使用集成解决方案进行更新。再次感谢您,感谢您的宝贵时间。
【解决方案2】:

您可以使用递归函数获取数组和所需级别,然后在级别为 1 时停止循环,此时您只需过滤掉该(子)数组中的非数组值:

function extractLevel(arr, level) {
    return level <= 1 
        ? arr.filter(val => !Array.isArray(val))
        : arr.filter(Array.isArray)
             .flatMap(arr => extractLevel(arr, level-1));
}

// demo
const array = ["1",["2","2"],[["3","3"],["3","3"]],[[[["4","4"],"3"],[["4","4"],"3"]],[["",""],["",""]]],[["3","3"],["3","3"]],["2","2"],"1"];
// extract the values (not arrays) at level 3:
console.log(extractLevel(array, 3));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 2022-07-18
    • 2015-06-18
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多