【问题标题】:How to group/flatten array into all combinations of sub-arrays如何将数组分组/展平为子数组的所有组合
【发布时间】:2018-01-30 12:58:56
【问题描述】:

想知道如何获取这样的嵌套数组:

var arr = [
    1,
    [ 
        2, 3, 4, 
        [ 
            5, 6, 7, 8, 
            [ 9, 10 ], 
            [ 11, 12 ]
        ], 
        [ 13, 14 ] 
    ] 
]   

并应用分组功能:

function group(arr) {

}

这样它将arr 转换为以下内容:

var output = [
  [1, 2, 5, 13, 9, 11],
  [1, 2, 5, 13, 9, 12],
  [1, 2, 5, 13, 10, 11],
  [1, 2, 5, 13, 10, 12]

  [1, 3, 5, 13, 9, 11],
  [1, 3, 5, 13, 9, 12],
  [1, 3, 5, 13, 10, 11],
  [1, 3, 5, 13, 10, 12],

  [1, 3, 6, 13, 9, 11],
  [1, 3, 6, 13, 9, 12],
  [1, 3, 6, 13, 10, 11],
  [1, 3, 6, 13, 10, 12],

  [1, 3, 7, 13, 9, 11],
  [1, 3, 7, 13, 9, 12],
  [1, 3, 7, 13, 10, 11],
  [1, 3, 7, 13, 10, 12],

  ...

  [1, 4, 5, 13, 9, 11],
  [1, 4, 5, 13, 9, 12],
  [1, 4, 5, 13, 10, 11],
  [1, 4, 5, 13, 10, 12],

  ...
]

基本上它会展平数组,或者您可以说获取所有子数组的每个组合,并将它们返回到一个平面列表中。在这个问题上打破了我的头。

【问题讨论】:

  • 那么,这些组合究竟是如何确定的?
  • 我不知道如何比示例输出更好地描述。
  • 用所有子数组组合构建一个数组是我能做的最好的。
  • 为什么你有一个嵌套结构,一个仅仅在级别上的深度数组就可以了。
  • @LancePollard 您的示例输出似乎错误。 13 不应该在最后一列吗?

标签: javascript arrays combinations


【解决方案1】:

看起来很简单 - 您想在所有嵌套级别上应用 cartesian product,并递归地展平元素。

但是,您的输入有点奇怪,如果您使用过它会更容易(而且更灵活!)

var arr = [
    [ 1 ],
    [
        [ 2, 3, 4 ],
        [
            [ 5, 6, 7, 8 ],
            [ 9, 10 ],
            [ 11, 12 ]
        ],
        [ 13, 14 ]
    ]
];

所以现在它需要一些切片来分割每个数组的两个部分:

function flatten(arr) { return [].concat(...arr); }
function group(arr) {
    const i = arr.findIndex(Array.isArray)
    return i < 0
      ? arr
      : cartesian([arr.slice(0, i), ...arr.slice(i).map(group)]).map(flatten);
}

有了灵活的输入格式,就可以了

function group(arr) {
  return arr.every(Array.isArray) // or even Array.isArray(arr[0])?
    ? cartesian(arr.map(group)).map(flatten) // group simply every element - even the first
    : arr;
}

【讨论】:

    猜你喜欢
    • 2021-10-04
    • 2021-10-06
    • 2011-11-03
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多