如何在JavaScript数组中查找所有元素组合
我有以下数组: [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]] 然后我会循环使用它,并对每个值进行处理 我甚至不知道从哪里开始,所以任何建议或指针都会非常有用 试试这个:如何在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'
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
创建一个并行数组,其中包含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);