js实现二维对象数组排列组合

411 阅读1分钟

说明

一个数组有三个子项,每一个子项的每一项和其他子项的每一项进行排列组合,得到的每一种组合再放进一个数组里
[
    [{'A':'A'},{'B':'B'}],
    [{'a':'a'},{'b':'b'}], 
    [{'1':'1'}, {'2':'2'}],
]
需要得到的是[ 
    [ { A: 'A' }, { a: 'a' }, { '1': '1' } ],
    [ { A: 'A' }, { a: 'a' }, { '2': '2' } ], 
    [ { A: 'A' }, { b: 'b' }, { '1': '1' } ],
    [ { A: 'A' }, { b: 'b' }, { '2': '2' } ],
    [ { B: 'B' }, { a: 'a' }, { '1': '1' } ], 
    [ { B: 'B' }, { a: 'a' }, { '2': '2' } ],
    [ { B: 'B' }, { b: 'b' }, { '1': '1' } ],
    [ { B: 'B' }, { b: 'b' }, { '2': '2' } ] 
]

函数封装

function permutate(arr) {
  if (arr.length === 1) {
    return arr[0].map((item) => [item]);
  }
  // 第一次的结果就是二维数组的第0项
  let res = arr[0].slice();

  for (let i = 1; i < arr.length; i++) {
    const pre = res.slice();
    res = [];
    pre.forEach((item) => {
      arr[i].forEach((curr) => {
        if (Object.prototype.toString.call(item) === "[object Object]") {
          res.push([item, curr]);
        } else {
          res.push([...item, curr]);
        }
      });
    });
  }
  return res;
}

情况一(特殊情况)

//当对象数组只有一项时,
let arr = [[{ A: "A" }, { B: "B" }]];
let result = permutate(arr);
console.log(result);
//[ [ { A: 'A' } ], [ { B: 'B' } ] ]

情况二

//当对象数组为多项时,
let arr = [[{'A':'A'},{'B':'B'}], [{'a':'a'},{'b':'b'}], [{'1':'1'}, {'2':'2'}]]
let result = permutate(arr)
console.log(result);
//[
  [ { A: 'A' }, { a: 'a' }, { '1': '1' } ],
  [ { A: 'A' }, { a: 'a' }, { '2': '2' } ],
  [ { A: 'A' }, { b: 'b' }, { '1': '1' } ],
  [ { A: 'A' }, { b: 'b' }, { '2': '2' } ],
  [ { B: 'B' }, { a: 'a' }, { '1': '1' } ],
  [ { B: 'B' }, { a: 'a' }, { '2': '2' } ],
  [ { B: 'B' }, { b: 'b' }, { '1': '1' } ],
  [ { B: 'B' }, { b: 'b' }, { '2': '2' } ]
]