如何拆分子阵列并生成唯一组合

时间:2018-05-18 08:42:50

标签: javascript arrays

我有一个数组

var arry = ['a','b','c','d',['l','o','p']];

我正在尝试编写一个函数,它确实给了我以下输出但是失败了

['a','b','c','d','l']
['a','b','c','d','o']
['a','b','c','d','p']

我搜索过类似的问题,但找不到合适的问题。 有人可以分享一些亮点吗?

更新: 有时我们可能有多个子数组:

   var arry = ['a','b','c','d',['l','o','p'],[1,4]];

然后

['a','b','c','d','l',1]
['a','b','c','d','o',1]
['a','b','c','d','p',1]
['a','b','c','d','l',4]
['a','b','c','d','o',4]
['a','b','c','d','p',4]

2 个答案:

答案 0 :(得分:2)

您可以将单个项目转换为数组并迭代它们并获取数组的所有组合。

function getCombinations(array) {
    function iter(index, temp) {
        if (temp.length === iterables.length) {
            result.push(temp);
            return;
        }
        iterables[index].forEach(v => iter(index + 1, temp.concat(v)));
    }

    var iterables = array.map(a => Array.isArray(a) ? a: [a]),
        result = [];
        
    iter(0, []);
    return result;
}

var array = ['a', 'b', 'c', 'd', ['l', 'o', 'p'], [1, 4]];

console.log(getCombinations(array).map(a => a.join(' ')));

答案 1 :(得分:1)

ES6

您还可以使用reduceconcatmap来获取所需的结果。

  • 首先将所有子阵列合并为一个数组

  • 然后创建所有子数组的组合

  • 然后你可以concat所有与你单一阵列的组合。

<强>样本

&#13;
&#13;
const arr = ['a', 'b', 'c', 'd', ['l', 'o', 'p'],[1, 4]];

let result = arr.reduce((r, v) => {
  Array.isArray(v) ? r.subArr.push(v) : r.arr.push(v);
  return r;
  }, {arr: [],subArr: []});

let allCombination = (arr, subArr) => {
  return subArr.reduce((acc, val) => acc.reduce((res, value) => res.concat(val.map(mval => [].concat(arr, value, mval))), []));
}

console.log(allCombination(result.arr, result.subArr));
&#13;
.as-console-wrapper {max-height: 100% !important;top: 0;}
&#13;
&#13;
&#13;

您也可以在创建子数组后使用generator function创建组合,并使用单个数组创建concat

<强>样本

&#13;
&#13;
const arr = ['a', 'b', 'c', 'd', ['l', 'o', 'p'],[1, 4]];

let result = arr.reduce((r, v) => {
  Array.isArray(v) ? r.subArr.push(v) : r.arr.push(v);
  return r;
  }, {arr: [],subArr: []});

function* combination(head, ...tail) {
  let remainder = tail.length ? combination(...tail) : [[]];
  for (let r of remainder) for (let h of head) yield [h, ...r];
}

for (let val of combination(...result.subArr)) {
  console.log(result.arr.concat(val));
}
&#13;
    .as-console-wrapper {max-height: 100% !important;top: 0;}
&#13;
&#13;
&#13;