2017-04-05 6 views
1

配列内の要素のすべての可能な組み合わせを生成する方法について、同様の質問がいくつかあります。しかし、私は非常に苦労して、の組み合わせだけを出力するアルゴリズムを書く方法を考えています。。すべての提案は非常に高く評価されます!Javascript - 1つの配列内の要素のすべての組み合わせを生成する(ペアで)

(N個の要素を持つ)次の配列を皮切り:、私は次のようなアプローチを試みていたが、これはすべての可能な組み合わせになり

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

var array = ["apple", "banana", "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

簡単な方法は、2番目のループの最初のi要素をスキップする配列に対して2回forループを実行することです。

ES5に書き換え

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);

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

ソリューションが発見されているが、私はここにすべての組み合わせのサイズnを見つけるための一般的なケースのためのアルゴリズムを投稿m (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);

関連する問題