2017-04-05 62 views
1

我見過幾個類似的問題,關於如何生成數組中所有可能的元素組合。但是我很難弄清楚如何編寫一個只能輸出組合的算法。任何建議將超級讚賞!Javascript - 在單個數組中生成元素的所有組合(成對)

與下面的數組開始(與N個元素):

var array = ["apple", "banana", "lemon", "mango"]; 

並得到以下結果:

var result = [ 
    "apple banana" 
    "apple lemon" 
    "apple mango" 
    "banana lemon" 
    "banana mango" 
    "lemon mango" 
]; 

我嘗試以下方法,但是這會導致所有可能的組合,而不是組合對。

var letters = splSentences; 
var combi = []; 
var temp= ""; 
var letLen = Math.pow(2, letters.length); 

for (var i = 0; i < letLen ; i++){ 
    temp= ""; 
    for (var j=0;j<letters.length;j++) { 
     if ((i & Math.pow(2,j))){ 
      temp += letters[j]+ " " 
     } 
    } 
    if (temp !== "") { 
     combi.push(temp); 
    } 
} 

回答

5

一個簡單的方法是在第二個循環中跳過第一個i元素的數組,在該數組上執行double循環。

let array = ["apple", "banana", "lemon", "mango"]; 
 
let results = []; 
 

 
// Since you only want pairs, there's no reason 
 
// to iterate over the last element directly 
 
for (let i = 0; i < array.length - 1; i++) { 
 
    // This is where you'll capture that last value 
 
    for (let j = i + 1; j < array.length; j++) { 
 
    results.push(`${array[i]} ${array[j]}`); 
 
    } 
 
} 
 

 
console.log(results);

改寫ES5:

var array = ["apple", "banana", "lemon", "mango"]; 
 
var results = []; 
 

 
// Since you only want pairs, there's no reason 
 
// to iterate over the last element directly 
 
for (var i = 0; i < array.length - 1; i++) { 
 
    // This is where you'll capture that last value 
 
    for (var j = i + 1; j < array.length; j++) { 
 
    results.push(array[i] + ' ' + array[j]); 
 
    } 
 
} 
 

 
console.log(results);

+0

完美地工作,感謝您的明確解釋! – dhdz

5

這裏是函數式編程 ES6解決方案:

var array = ["apple", "banana", "lemon", "mango"]; 
 

 
var result = array.reduce((acc, v, i) => 
 
    acc.concat(array.slice(i+1).map(w => v + ' ' + w)), 
 
[]); 
 

 
console.log(result);

+0

添加一些傳播運營商更多的美,而不是'CONCAT()'。 :D – SrAxi

0

試試這個: https://jsfiddle.net/e2dLa9v6/

var array = ["apple", "banana", "lemon", "mango"]; 
var result = []; 

for(var i=0;i<array.length-1;i++){ 
    for(var j=i+1;j<array.length;j++){ 
    result.push(array[i]+" "+array[j]); 
    } 
} 
for(var i=0;i<result.length;i++){ 
    alert(result[i]); 
} 
0

雖然解決方案已經找到,我張貼在這裏的算法一般情況下找到所有組合大小nm (m>n)元素。在你的情況下,我們有n=2m=4

const result = []; 
 
result.length = 2; //n=2 
 

 
function combine(input, len, start) { 
 
    if(len === 0) { 
 
    console.log(result.join(" ")); //process here the result 
 
    return; 
 
    } 
 
    for (var i = start; i <= input.length - len; i++) { 
 
    result[result.length - len] = input[i]; 
 
    combine(input, len-1, i+1); 
 
    } 
 
} 
 

 
const array = ["apple", "banana", "lemon", "mango"];  
 
combine(array, result.length, 0);