vue2 多个数组如何按照要求合并成一个数组?

新手上路,请多包涵

我正在开发一个商城
在开发【发布商品】的模块时,遇到了一个问题,希望高手解答

现在有多个数组:

a = [1,2,3,4,5]
b = [a,b,c]
c = [A,Z]

请问如何才能重组成类似于下面的数组

mix = ['1aA','1aZ','1bA','1bZ','1cA','1cZ','2aA','2aZ'..........]

请问大佬如何实现呢?另外,这种功能叫什么?

回复
阅读 838
4 个回答

固定数组解法:
image.png

  const a = [1, 2, 3, 4, 5];
  const b = ['a', 'b', 'c'];
  const c = ['A', 'Z'];
  const result = [];
  for (let aItem of a) {
    for (let bItem of b) {
      for (let cItem of c) {
        result.push('' + aItem + bItem + cItem);
      }
    }
  }
  console.log(result);

任意数组解法:
image.png

const demo=function(...args) {
  const result = [];
  const arrays = args.filter(arg => arg.length);
  build(arrays, 0, '', result);
  console.log(result);
};
const build=function (arrays, index, str, result) {
  const array = arrays[index++];
  if (!array) {
    result.push(str);
    return;
  }
  for (let item of array) {
    build(arrays, index, str + item, result);
  }
}
这个问题和 Vue 无关,就是纯纯的 JS 的问题,甚至都可以语言无关。建议改下标题。

固定数组个数(3个以内)用多重循环遍历,非固定数量的第一反应是用递归。

function combo(...arrays) {
    if (!arrays.length) { return []; }
    const [current, ...rest] = arrays;
    return rest.length
        ? combo(...rest).flatMap(r => current.map(c => `${c}${r}`))
        : current;
}

// 调用示例
console.log(combo(a, b, c));

但实际上,这是一个尾递归,可以用循环来实现(使用了 reduce,实际就是循环)

function combo(...arrays) {
    return arrays.reduce(
        (r, row) => r.flatMap(it => row.map(c => `${c}${it}`)),
        [""]
    );
}

console.log(combo(a, b, c));

电商商品 属性 生成 SKU 的过程是用 笛卡尔积 ,很多语言实现可以自行搜索

// 首先计算[1,2,3,4,5] * ['a','b','c'],得到结果[1a, 1b, 1c, 2a, 2b, 2c...]
// 然后计算[1a, 1b, 1c, 2a, 2b, 2c...] * [A, Z],得到最终结果[1aA, 1aZ, 1bA, 1bZ, 1cA, 1cZ...]
let a = [1,2,3,4,5]
let b = ['a','b','c']
let c = ['A','Z']
let d = ['q','w']
function permutation (val) {
    return val.reduce((prev, cur) => {
        let arr = []
        prev.forEach(v => {
            cur.forEach(it => {
                arr.push(`${v}${it}`)
            })
        })
        return arr
    })
}
console.log(permutation([a, b]))
console.log(permutation([a, b, c]))
console.log(permutation([a, b, c, d]))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏