Javascript合并数组合

时间:2017-06-27 10:41:44

标签: javascript arrays

我有两个数组:

const sizes = ['large', 'medium']
const colors = ['blue', 'red', 'orange']

我需要创建一个最终数组,将数组与所有可能的值组合在一起,如下所示:

const final = ['blue large', 'red large', 'orange large', 'blue medium', 'red medium', 'orange medium']

sizescolors都可以为空。

我更喜欢使用lodash执行此操作,并且我已经尝试过如此循环:

sizes.forEach((size) => {
  colors.forEach((color) => {
    actualVariants.push(`${size} ${color}`)
  })
})

colors.forEach((size) => {
  sizes.forEach((color) => {
    actualVariants.push(`${color} ${size}`)
  })
})

然而,这确实有效:它包含重复项,我想确保以最有效的方式执行此操作。

当数组为空时,这也不起作用。

3 个答案:

答案 0 :(得分:2)

只需删除你的第一个阻止:

此处示例:https://jsbin.com/qovojacuci/edit?js,console

const sizes = ['large', 'medium']
const colors = ['blue', 'red', 'orange']

let actualVariants = []

colors.forEach((size) => {
  sizes.forEach((color) => {
    actualVariants.push(`${color} ${size}`)
  });
});

console.log(actualVariants);

如果您希望数组的排序方式与final不变,请更改循环顺序:

const sizes = ['large', 'medium']
const colors = ['blue', 'red', 'orange']

let actualVariants = []

sizes.forEach((size) => {
  colors.forEach((color) => {
    actualVariants.push(`${color} ${size}`)
  });
});

console.log(actualVariants);

答案 1 :(得分:0)

通过for循环解决方案:

const sizes = ['large', 'medium'];
const colors = ['blue', 'red', 'orange'];

var final=new Array();

for(var i=0;i<sizes.length;i++){
  for(var z=0;z<colors.length;z++){
    final.push(colors[z]+' '+sizes[i]);
  }
}
console.log(final);

答案 2 :(得分:0)

我定义了一个通用combine方法,可以将两个数组合并为一个。

该方法将始终循环arr1.length * arr2.length次,以便能够生成所有有效结果。因此,对于['a', 'b', 'c'][1, 2],您将获得3 x 2 = 6组合调用和长度为6的数组。

将它作为一个函数写入一个带有两个数组并返回一个并支持空数组的好处是,你可以在reduce中使用它来组合任意数量的数组

&#13;
&#13;
// `combiner` is a function that combines an element from `xs`
// and one from `ys` in to one value
const combine = combiner => (xs, ys) => {
  if (!xs || !xs.length) return ys;
  if (!ys || !ys.length) return xs;
  
  // Note, this can still be done using two forEach loops
  // in some cases, `concat` might be too slow...
  return xs.reduce(
    (acc, x) => acc.concat(ys.map(combiner(x))),
    []
  );
}
  
// Example use:

// Make different combiners:
const combineWithSpace = combine(x => y => `${x} ${y}`);
const combineWithDot = combine(x => y => `${x}.${y}`);

const prefix = ["a", "b", "c"];
const suffix = [1, 2];

// Now  you can do:
log("Prefix Suffix:", combineWithSpace(prefix, suffix));

// Support for empty arrays:
log("One empty array:", combineWithSpace(prefix, []));

// But you can also use it as a reducer:
log("Custom:", 
  [prefix, suffix, ["i", "ii", "iii"]].reduce(combineWithDot)
);


function log(label, arr) { console.log(label, JSON.stringify(arr)) };
&#13;
&#13;
&#13;