我的思路是这样的:

先看成一个组合的问题([x]选n)

再写一个过滤器把含有有同一组元素的组合过滤掉.

这样扩展性会比较好;

//合并数组

function concat(...arrs){

return [].concat(...arrs);

}

//过滤器 判断是不符合规则

function getFilter(...arrs){

return function(arr){

var haveArr = new Set();

for(let v of arr){

let perr = arrs.find((a)=>{

return a.includes(v)

})

if(haveArr.has(perr)){

return false

}else{

haveArr.add(perr)

}

}

return true;

}

}

//递归组合实现

function zuhe(arr,n){

var pass = new Set();

var zh = []

if(n<0 || arr.length < n){throw '参数错误'}

if(n == 1){

for(let v of arr){

if(!pass.has(v)){ //去重

pass.add(v);

zh.push([v]);

}

}

return zh;

}else if(arr.length == n){

return [arr];

}

for(let i=0; i <= arr.length-n; i++ ){

let v = arr[i];

if(!pass.has(v)){ //去重

pass.add(v);

let _zh = zuhe(arr.slice(i+1),n-1).map(a=>{

a.unshift(v)

return a;

})

zh = zh.concat(_zh)

}

}

return zh;

}

//----------以上是所需要的工具函数

var arr1 = ["a","b"];

var arr2 = ["A","B"];

var arr3 = ["1","2"];

var allArr = concat(arr1,arr2,arr3); //合并数组

var filter = getFilter(arr1,arr2,arr3); //生成过滤器

var zh1 = zuhe(allArr,2).filter(v=>filter(v)).map(v=>v.join("_")); // x选2>过滤>组装成需要格式

var zh2 = zuhe(allArr,3).filter(v=>filter(v)).map(v=>v.join("_")); // x选3>过滤后>组装成需要格式

console.log(zh1);

console.log(zh2);

/*

["a_A","a_B","a_1","a_2","b_A","b_B","b_1","b_2","A_1","A_2","B_1","B_2"]

["a_A_1","a_A_2","a_B_1","a_B_2","b_A_1","b_A_2","b_B_1","b_B_2"]

*/

---------------- 补充

想明白 其实还是一个组合的问题 只是组合的结果要处理一下 稍微改一下 zuhe 函数:

function zuhe(arr,n){

var pass = new Set();

var zh = []

if(n<0 || arr.length < n){throw '参数错误'}

if(n == 1){

for(let _arr of arr){

for(let v of _arr){

if(!pass.has(v)){ //去重

pass.add(v);

zh.push([v]);

}

}

}

return zh;

}

for(let i=0; i <= arr.length-n; i++ ){

for(let v of arr[i]){

if(!pass.has(v)){ //去重

pass.add(v);

let _zh = zuhe(arr.slice(i+1),n-1).map(a=>{

a.unshift(v)

return a;

})

zh = zh.concat(_zh)

}

}

}

return zh;

}

var arr1 = ["a","b","c"];

var arr2 = ["A","B"];

var arr3 = ["1","2"];

var zh2 = zuhe([arr1,arr2,arr3],2)

var zh3 = zuhe([arr1,arr2,arr3],3)

console.log(zh2)

console.log(zh3)

数组元素两两组合 php,js多个数组元素两两组合三三组合相关推荐

  1. c语言一维数组转化为二维矩阵,js将一维数组转化为二维数组

    遇到的问题: 后端返回的是一组一维数组,但是需要展示的格式是二维数组,常见的场景举例:后台返回10个长度的数组,需要分成3个一组展示在banner上. 例:[1,2,3,4,5,6,7,8,9,10] ...

  2. js中定义数组的两种方式

    js中定义数组: 注意事项: 1.在js中定义数组,不用担心数组角标越界的问题,可以自动扩容. 2.在js中,数组是可以定义任何数据类型的. 1.指定数组长度 运行结果: 2.简写方式:

  3. js的tree数组对象扁平化思否_JS专题之数组展开

    前言 首先什么是数组展开? 假如现在有这样一个需求:将后台的一个多重 List 数据,展开成一个 List 后,并去重后排序: ["a", "b", [&quo ...

  4. JS DOM获取标签/元素style样式

    JS DOM获取标签/元素style样式 文章目录 JS DOM获取标签/元素style样式 .style getComputedStyle() .style 只能获取行内样式,不能获取style标签 ...

  5. JS阻止冒泡和元素默认事件

    JS阻止冒泡和元素默认事件 文章目录 JS阻止冒泡和元素默认事件 1.JS阻止冒泡 :stopPropagation() 2.阻止元素默认事件行为 preventDefault() onclick + ...

  6. js list删除指定元素_删除js数组中的指定元素,有这两步就够了

    js数组是js部分非常重要的知识,有时我们有这么个需求js数组删除指定元素,先定义一个函数来获取删除指定元素索引值,然后用js数组删除的方法,来删除指定元素即可,就两步不难,很简单. 1.JS的数组对 ...

  7. java json 去重_js操作两个json数组合并、去重,以及删除某一项元素

    两个json数组合并去重,以及删除某一项元素 let ha = [ {id:'H',name:'3'}, {id:'A',name:'6'}, {id:'B',name:'14'}, {id:'C', ...

  8. vue 删除两个集合中相同的数据_vue.js如何删除数组里面的数据

    vue.js如何删除数组里面的数据 发布时间:2020-12-10 12:04:44 来源:亿速云 阅读:107 作者:小新 这篇文章主要介绍了vue.js如何删除数组里面的数据,具有一定借鉴价值,需 ...

  9. 遍历strs数组,并判断数组中每一个元素的长度, * 将长度为偶数的元素和长度为奇数的元素分别存放在两个集合中,

    package Day08;import java.util.ArrayList;/*** 二* 字符串数组strs中包含字符串{"12","345",&quo ...

最新文章

  1. 人工智能对教育产业的冲击和机遇分析 ——游戏化学习
  2. 快速生成NHibernate的映射文件和映射类的利器 —— codesmith软件
  3. 双11奇迹背后的大数据平台,不喧哗,自有声!
  4. Exploring Ionic Lists
  5. 百度以侵犯商业秘密起诉前高管王劲 索赔5000万 内附王劲离职承诺函
  6. jenkins vue 打包特别慢_Jenkins 自动化部署
  7. 跨越鸿沟:计算机视觉-学术界与工业界的GAP有多大?
  8. [Spark版本更新]--Spark-2.4.0 发布说明
  9. 当我们在谈论瑞幸咖啡的时候,我们谈论什么?
  10. 被遗忘权的崩塌:当AI可以通过你的朋友了解你
  11. PostOffice
  12. 【原创】北京智能云分院招商项目之五:智能
  13. 为什么我不做金蝶二次开发了,个人的感受!
  14. 国内免费接收回复Google Voice短信的方法
  15. BZOJ:3441 乌鸦喝水
  16. Win11预览体验计划显示Your PC does not meet the minimum hardware requirements...的解决方案
  17. 发布微头条显示调用服务器失败,发布的微头条,有的标明“内容已编辑”,有的未标示,这是怎么回事?...
  18. 全国高校食堂排行榜TOP10?!
  19. Docker三大核心之容器
  20. Scratch少儿编程与游戏:一起拍蚊子吧

热门文章

  1. HTML+CSS+JavaScript速成
  2. QEMU imx6ul开发板环境搭建
  3. Java方法和数组练习
  4. 5G聚合路由器助力无人机监控盲区打好疫情阻击战
  5. JS异步:执行原理与回调
  6. php 信用卡通道api,php – PayPal REST API为信用卡令牌返回500 Server错误
  7. WebGIS前端框架(openlayers,mapbox,leaflet)图形图像底层渲染原理分析
  8. 向身边优秀的人学习,让自己变得优秀
  9. 什么样的程序员才算得上优秀,把导师曾对我说的话送给大家(比代码更重要的事)
  10. python导入库关键词_怎么样导入RobotFramework 自定义关键字(库文件)