js两个数组排列组合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js两个数组排列组合相关的知识,希望对你有一定的参考价值。

var a = ["A","B"], b = ["1","2"];
//要求,排列组合结果为:A1,A2,A12,B1,B2,B12,AB1,AB2,AB12
//两个数组还可以增加元素,以此类推
这种排列组合,要怎么写啊?求高人指教!!!

<html>
<head>
    <title>js两个数组排列组合</title>
    <script type="text/javascript">
    var a = ["A","B","C"];
    var b = ["1", "2","3"];
    window.onload = function () 
        var a1 = new objPL(a);//计算数组a的排列组合
        var b1 = new objPL(b);//计算数组b的排列组合
        var str = "";
        var n = 0;
        //a1和b1的排列组合个数就是两者相乘(双层循环)
        for (var i = 0; i < a1.length; i++) 
            for (var j = 0; j < b1.length; j++) 
                str += a1[i] + b1[j] + " ";
                n++;
            
            str += "<br/>";
        
        document.write("共" + n + "个<br/>");
        document.write(str);
    
    //取数组的排列组合
    function objPL(arr) 
        this.a = arr;
        this.r = [];
        this.n = 0;
        //从M个数里面取N个(递归)
        this.mGetN = function (curIndex, num, curSelect) 
            if (num == 0) 
                this.r[this.n++] = curSelect; return;
            
            if (this.a.length - curIndex < num) return;
            this.mGetN(curIndex + 1, num - 1, curSelect + this.a[curIndex]);
            this.mGetN(curIndex + 1, num, curSelect);
        
        for (var i = 1; i <= this.a.length; i++) 
            this.mGetN(0, i, "");
        
        return this.r;
    
    </script>
</head>
<body></body>
</html>

 

["A","B","C"]与["1","2","3"]组合的结果:

参考技术A var aArr = ['a', 'b', 'c'];
var bArr = ['大', '小'];
var cArr = ['西瓜', '冬瓜', '葡萄'];
var dArr = [name:'hello',name:'look'];
// 装载所有需要组合的数组
var totalArr = [aArr, bArr, cArr,dArr];
// 最终得到的所有的元素组合数组
var targetList = [];
// 所有的数组组合放在一起计算
function countList(allArr)
if (allArr && allArr.length > 0)
if (allArr.length > 1)
var iArr = allArr[0];
var jArr = allArr[1];
var newArr = twoArrComp(iArr, jArr);
var leftArr = [];
for(var m = 0;m<allArr.length;m++)
if(m>1)
leftArr.push(allArr[m])


leftArr.unshift(newArr);
if(leftArr.length>1)
countList(leftArr);
else
targetList = leftArr;

else
targetList = allArr[0];



countList(totalArr);
console.log(targetList);
// 数组两两组合
var _resultArr = [];
function twoArrComp(aArr, bArr)
var listArr = [];
if (aArr && aArr.length > 0 && bArr && bArr.length > 0)
aArr.forEach(function (aItem)
bArr.forEach(function (bItem)
_resultArr = [];
splitArrToOneDir(aItem);
splitArrToOneDir(bItem);
listArr.push(_resultArr)
)
)

return listArr;

// 函数递归,把多维数组拆成一维平面数组
function splitArrToOneDir(item)
if(isArray(item) == true)
item.forEach(function(childItem)
if(isArray(childItem) == true)
splitArrToOneDir(childItem)
else
_resultArr.push(childItem);

)
else
_resultArr.push(item);


// 判断是否是Array数组
function isArray(item)
var _isArray = false;
if (Array.isArray)
_isArray = Array.isArray(item);
else
_isArray = Object.prototype.toString().call(item) === "[object Array]"

return _isArray;
参考技术B var c=new Array(); 
var k=0,as="",bs="";
//A1,A2...... 赋值给数组c
 for(var i=0;i<a.length;i++)

    for(var j=0;j<b.length;j++)
    
        c[k]=a[i]+b[j];
        k++; 
    

//求a中字符和 
for(var m=0;m<a.length;m++)

     as+=a[m];

//求b中字符和 
for(var n=0;n<b.length;n++)

     bs+=b[n];  

// AB1,AB2赋值给数组c
 for(n=0;n<b.length;n++)

     c[k]=as+b[n];
     k++;  

//A12,B12赋值给数组c 
for(m=0;m<a.length;m++)

     c[k]=a[m]+bs;
     k++;  

c[k]=as+bs;//将AB12赋值给数组c 
for(k=0;k<c.length;k++)
   alert(c[k]);

使用 JavaScript 将两个数组的所有可能组合作为数组数组获取

【中文标题】使用 JavaScript 将两个数组的所有可能组合作为数组数组获取【英文标题】:Get all possible set of combinations of two arrays as an array of arrays with JavaScript 【发布时间】:2020-01-08 11:19:02 【问题描述】:

请注意:链接的问题“如何为两个数组的内容创建每个可能的组合?” 没有解决这个特定的问题。标记的人并不完全理解这个特定的排列和要求。

如果您有两个数组(arr1arr2),每个数组中有 n 个元素(即每个数组的长度相同),那么问题是:获取/确定所有元素的最佳方法是什么?可能匹配的元素与 same 数组中的其他元素不匹配且顺序无关紧要?

例如,假设我有:

arr1 = ["A","B","C"];
arr2 = ["Z","Y","X"];

我想返回一个数组数组,其中一个数组的每个元素都与另一个数组的元素配对。所以结果将是一组独特的数组:

matches = [
    [["A","Z"],["B","Y"],["C","X"]],
    [["A","Z"],["B","X"],["C","Y"]],
    [["A","Y"],["B","X"],["C","Z"]],
    [["A","Y"],["B","Z"],["C","X"]],
    [["A","X"],["B","Z"],["C","Y"]],
    [["A","X"],["B","Y"],["C","Z"]],
]

请注意,这两个数组是相同的:

[["A","Z"],["B","Y"],["C","X"]]
[["B","Y"],["C","X"],["A","Z"]]

我正在尝试使用 vanilla JavaScript 来做到这一点,但我也完全愿意使用 Lodash。额外的好处是,因为这可能会失控,所以速度和性能很重要。但现在,我只是想得到一些能产生正确结果集的东西。为了限制这一点,此函数可能不会与两个以上的数组一起使用,每个数组包含 50 个元素。

这是我最近的尝试(使用 lodash):

function getMatches(arr1, arr2)
    var matches = [];
    for (var arr1i = 0, arr1l = arr1.length; arr1i < arr1l; arr1i++) 
        for (var arr2i = 0, arr2l = arr2.length; arr2i < arr2l; arr2i++) 
            matches.push(_(arr1).zip(arr2).value());
            arr2.push(arr2.shift());
        
    
    return matches;

【问题讨论】:

到目前为止你有什么尝试? 已将其添加到问题中。 它看起来不像是重复的...... 这是怎么复制的?最初的问题在哪里被问到?链接的问题“如何为两个数组的内容创建每个可能的组合?”不能解决这个特定的问题。让我重新命名,因为我对配对组合本身不感兴趣,而是对组合集感兴趣。 【参考方案1】:

[[A, 1], [B, 2]]

相同

[[B, 2], [A, 1]]

在您的情况下,这意味着解决方案取决于您与数组的第一个元素配对的内容。您可以将 n 个不同的元素作为第二个元素与第一个元素配对,然后将 n - 1 个不同的元素作为第二个元素与第二个元素配对,依此类推,因此您有 n!可能性,这是可能的排列数。

因此,如果您更改数组元素的顺序但它们是同一对,则它们是等效的,因此您可以将第一个元素视为固定有序的项目集,将第二个元素视为要置换的项目。

让 arr1 = [a1, ..., an] 和 arr2 = [b1, ..., bn] 我们可以避免改变 a1 的顺序。因此,您排列内部元素并将外部元素的顺序视为不变,例如:

const permutations = function*(elements) 
  if (elements.length === 1) 
    yield elements;
   else 
    let [first, ...rest] = elements;
    for (let perm of permutations(rest)) 
      for (let i = 0; i < elements.length; i++) 
        let start = perm.slice(0, i);
        let rest = perm.slice(i);
        yield [...start, first, ...rest];
      
    
  


var other = ['A', 'B', 'C'];
var myPermutations = permutations(['X', 'Y', 'Z']);
var done = false;
while (!done) 
    var next = myPermutations.next();
    if (!(done = next.done)) 
        var output = [];
        for (var i = 0; i < next.value.length; i++) output.push([other[i], next.value[i]]);
        console.log(output);
    

【讨论】:

【参考方案2】:

您只是在寻找permutations。元组的第一个元素始终相同,第二个元素被置换,以便您获得所有不同的组合集。

const arr1 = ["A","B","C"];
const arr2 = ["Z","Y","X"];

const result = permutate(arr2).map(permutation =>
    permutation.map((el, i) => [arr1[i], el])
);

【讨论】:

你能在sn-p中添加你正在调用的函数吗? @mplungjan 链接规范中的任何功能都应该工作 但是你给的链接没有指向你想要的那个 @mplungjan 我链接了这个问题,而不是具体的实现。例如,来自this answer 的那个可以正常工作,但是由 OP 决定使用哪一个(他们可能会以不同的顺序输出排列)。

以上是关于js两个数组排列组合的主要内容,如果未能解决你的问题,请参考以下文章

js 数组全排列组合算法

java字母和数字排列组合后

js 排列 组合 的一个简单例子

字符串数组全排列——逐个追加组合算法

将两个数组 排列组合到一个数组集合 求java 代码

如何从一个1d Numpy数组的所有排列组合中删除所有的圆台排列组合?