如何在JavaScript中合并更多数组
我有3个或更多阵列:如何在JavaScript中合并更多数组,javascript,arrays,Javascript,Arrays,我有3个或更多阵列: var array1 = [a,b,c]; var array2 = [c,d]; var array3 = [e,f]; 要获得1个合并数组,其结果如下: result = [ace, acf, ade, adf, bce, bdf, bde, bdf, cce, ccf, cde, cdf] 我怎么做?请注意:数组输入将不受限制。您可以使用迭代和递归方法以及组合算法 函数组合(数组){ 功能c(部分,索引){ 数组[index].forEach(函数(a){
var array1 = [a,b,c];
var array2 = [c,d];
var array3 = [e,f];
要获得1个合并数组,其结果如下:
result = [ace, acf, ade, adf, bce, bdf, bde, bdf, cce, ccf, cde, cdf]
我怎么做?请注意:数组输入将不受限制。您可以使用迭代和递归方法以及组合算法
函数组合(数组){
功能c(部分,索引){
数组[index].forEach(函数(a){
var p=部分混凝土([a]);
if(p.length==array.length){
r、 推(p.join(“”));
返回;
}
c(p,指数+1);
});
}
var r=[];
c([],0);
返回r;
}
log(组合(['a','b','c'],['c','d'],['e','f']]);
log(组合(['a','b','c'],['d','e'],['f','g'],['h','i','j'])代码>
.as控制台包装{max height:100%!重要;top:0;}
尝试使用for循环
vararray1=[“a”、“b”、“c”];
var array2=[“c”,“d”];
var array3=[“e”,“f”];
var result=[],pushresult=0;
对于(变量i=0;i如果数组数是固定的(不是数组元素),则可以使用
var array1=[“a”、“b”、“c”];
var array2=[“c”,“d”];
var array3=[“e”,“f”];
var d=[];
对于(阵列1中的i){
对于(阵列2中的j){
对于(阵列3中的k){
d、 推送(array1[i]+array2[j]+array3[k]);
}
}
}
警戒(d);
似乎您正试图从多个数组(集合)中获取笛卡尔积。
考虑使用Array.concat
、Array.reduce
和Array.map
函数使用以下ES6解决方案:
const flatte=(arr)=>[].concat.apply([],arr);
常数乘积=(…集合)=>
集合。减少((acc,集合)=>
展平(acc.map(x=>set.map(y=>[…x,y])),
[[]]);
var array1=['a','b','c'],
array2=['c','d'],
数组3=['e','f'];
结果=产品(阵列1、阵列2、阵列3);
log(JSON.stringify(result))代码>列表应用程序和monad可以轻松实现这一点
//数组应用程序
Array.prototype.ap=函数(…args)
{
常量循环=(acc,[x,…xs])=>
x==未定义
?[本[0](…acc)]
:x.chain(a=>
环路(根据concat([a]),xs))
返回循环([],args)
}
//数组单子
Array.prototype.chain=功能链(f)
{
返回此值。减少((acc,x)=>
acc.concat(f(x)),[])
}
//艰苦的工作已经完成了
常量组合=(…xxs)=>
[(…xs)=>xs].ap(…xxs)
console.log(组合(array1、array2、array3))
//[a1',a2',a3'],
//[‘a1’、‘a2’、‘b3’],
//[‘a1’、‘a2’、‘c3’],
//[‘a1’、‘b2’、‘a3’],
//[‘a1’、‘b2’、‘b3’],
//[‘a1’、‘b2’、‘c3’],
//[‘b1’、‘a2’、‘a3’],
//[‘b1’、‘a2’、‘b3’],
//[‘b1’、‘a2’、‘c3’],
//[‘b1’、‘b2’、‘a3’],
//[‘b1’、‘b2’、‘b3’],
//[‘b1’、‘b2’、‘c3’],
//[‘c1’、‘a2’、‘a3’],
//[‘c1’、‘a2’、‘b3’],
//[‘c1’、‘a2’、‘c3’],
//[‘c1’、‘b2’、‘a3’],
//[‘c1’、‘b2’、‘b3’],
//[‘c1’、‘b2’、‘c3’],
//[‘d1’、‘a2’、‘a3’],
//[‘d1’、‘a2’、‘b3’],
//[‘d1’、‘a2’、‘c3’],
//[‘d1’、‘b2’、‘a3’],
//[‘d1’、‘b2’、‘b3’],
//['d1','b2','c3']
似乎需要一个数组.prototype.cartesian()
来处理不确定数量的数组。它可以做如下工作
Array.prototype.cartesian=函数(…a){
返回a.length?this.reduce((p,c)=>(p.push(…a[0]。笛卡尔(…a.slice(1)).map(e=>a.length>1?[c,…e]:[c,e])),p),[])
:这个;
};
var arr1=[“a”、“b”、“c”],
arr2=[“c”,“d”],
arr3=[“e”,“f”],
结果=arr1笛卡尔(arr2,arr3);
log(JSON.stringify(result))代码>你似乎在寻找所有的组合,而不是一个“合并”。我同意,这不是你在寻找的.concat()
。既然你可以让你的代码成为一个可运行的代码片段,为什么还要在别处发布呢?是的。但是,我不知道怎么做(@priya_singh供您参考谢谢您的帮助。但是如果我有4、5或100个这样的数组,我必须使用100时间循环?:(.Thank.Thank:)for..in
更适合在ObjectsSup上循环用于识别catesian产品。
if you number of array is fixed (not array element) then you can use
<script>
var array1 = ["a","b","c"];
var array2 = ["c","d"];
var array3 = ["e","f"];
var d=[];
for(i in array1){
for (j in array2){
for(k in array3){
d.push(array1[i]+array2[j]+array3[k]);
}
}
}
alert(d);
</script>