Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript数组中查找所有元素组合_Javascript_Arrays_Combinations - Fatal编程技术网

如何在JavaScript数组中查找所有元素组合

如何在JavaScript数组中查找所有元素组合,javascript,arrays,combinations,Javascript,Arrays,Combinations,我有以下数组: [A,1,X],[B,2,Y],[C,3,Z]] 我希望能够获得每个子数组的第一个索引的所有组合,然后循环通过这些组合在每个子数组上执行单个任务。这些是我想要的组合(注意,我也需要相同值的组合): [A,A],[A,B],[A,C],[B,A],[B,B],[B,C],[C,A],[C,B],[C,C]] 然后我会循环使用它,并对每个值进行处理 我甚至不知道从哪里开始,所以任何建议或指针都会非常有用 试试这个: var data = [['A',1,'X'],['B',2,'Y'

我有以下数组:

[A,1,X],[B,2,Y],[C,3,Z]]

我希望能够获得每个子数组的第一个索引的所有组合,然后循环通过这些组合在每个子数组上执行单个任务。这些是我想要的组合(注意,我也需要相同值的组合):

[A,A],[A,B],[A,C],[B,A],[B,B],[B,C],[C,A],[C,B],[C,C]]

然后我会循环使用它,并对每个值进行处理

我甚至不知道从哪里开始,所以任何建议或指针都会非常有用

试试这个:

var data = [['A',1,'X'],['B',2,'Y'],['C',3,'Z']];

function getCombinations(data) {
    var combinations = [];
    data.forEach(function(first) {
        data.forEach(function(second) {
            combinations.push([first[0], second[0]]);
        });
    });
    return combinations;
}

console.log(getCombinations(data));

以下是您需要在数组中有效循环两次的

。根据所需内容,每次只需静态访问第一个元素:

var arr = [['A',1,'X'],['B',2,'Y'],['C',3,'Z']];
var newArr = [];
var length = arr.length;
var curr;

for (var i = 0; i < length; i++) {
    curr = arr[i][0];

    for (var j = 0; j < length; j++) {
        newArr.push([curr, arr[j][0]]);
    }
}

console.log(newArr);
var arr=[[A',1,'X'],[B',2,'Y'],[C',3,'Z'];
var newArr=[];
变量长度=arr.length;
var-curr;
对于(变量i=0;i

让我们来分解这个问题。首先,让我们提取每个子阵列的第一个元素:

function get_elts(data, idx) {
    return data.map(function(v) { return v[idx]; });
}
所以

像这样分解问题是好的程序设计的基础。我们不想写那些把多个问题搞得一团糟的东西。在这种情况下,多个问题是(1)获取每个子阵列的第一个元素和(2)找到组合。如果我们编写的一个例程混淆了这两个问题,那么我们将永远无法将其用于其他事情。如果我们的老板说现在他想找到每个子数组的第二个元素的所有组合,我们将不得不剪切粘贴并创建几乎重复的代码。然后,我们将在我们的余生中或至少在我们退出之前维护这些代码。保理业务的规则是越早越好

然后,创建任意两个阵列的所有组合:

function combinations(arr1, arr2) {      //create all combos of elts in 2 arrays by
    return [].concat.apply(              //concatenating and flattening
        [],                              //(starting with an empty array)
        arr1.map(                        //a list created from arr1  
            function(v1) {               //by taking each elt and from it
                return arr2.map(         //creating a list from arr2
                    function(v2) {       //by taking each element and from it
                        return [v1, v2]; //making a pair with the first elt
                    }
                );
            };
        )
    );
}
通常我们会写得更紧凑。让我们浏览一下:

  • Array#concat
    将一个或多个对象或这些对象中的元素(如果它们是数组)组合到一个数组中
  • Function#apply
    让我们提供一个数组,该数组将变成
    concat
    的参数列表
  • Array#map
    arr1
    创建一个并行数组,其中包含
  • 元素是基于arr2上的循环的两个元素数组
  • 对,这不是你妈妈的JavaScript。它几乎是一种不同于你初始化这个,设置那个,循环另一个东西,然后返回其他东西的语言。通过采用这种风格,我们最终得到的代码更加精确、简洁、可重用、可证明正确、对未来友好,并且可能是可优化的

    所谓未来友好,我指的是ES6友好。上述内容可以改写为:

    combinations = (arr1, arr2) => [].concat(...arr1.map(v1 => arr2.map(v2 => [v1, v2])));
    
    准备好,伙计们,这很快就会出现在你们的工作面试中。是时候离开jQuery了

    现在问题可以表述为:

    var first_elts = get_elts(data, 0);
    combinations(first_elts, first_elts);
    
    var first_elts = get_elts(data, 0);
    combinations(first_elts, first_elts);