我有两个数组:
const sizes = ['large', 'medium']
const colors = ['blue', 'red', 'orange']
我需要创建一个最终数组,将数组与所有可能的值组合在一起,如下所示:
const final = ['blue large', 'red large', 'orange large', 'blue medium', 'red medium', 'orange medium']
sizes
和colors
都可以为空。
我更喜欢使用lodash
执行此操作,并且我已经尝试过如此循环:
sizes.forEach((size) => {
colors.forEach((color) => {
actualVariants.push(`${size} ${color}`)
})
})
colors.forEach((size) => {
sizes.forEach((color) => {
actualVariants.push(`${color} ${size}`)
})
})
然而,这确实有效:它包含重复项,我想确保以最有效的方式执行此操作。
当数组为空时,这也不起作用。
答案 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
中使用它来组合任意数量的数组!
// `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;