2015-03-20 8 views
5

मैं रूबी पृष्ठभूमि से आया हूं, जिसमें enumerable कक्षा है। रूबी में, मैं आसानी से सरणी तत्वों के संयोजन मिल सकता है।जावास्क्रिप्ट सरणी - 2 तत्वों के संयोजनों की संख्या ढूँढना

array.combination(2).count 

मुझे पता है कि जावास्क्रिप्ट की सुविधा नहीं है इस तरह के कार्यों में बनाया गया है, इसलिए मैं सोच रहा था कि कैसे मैं जे एस में यह लागू हो सकता है। मैं की तरह

कुछ सोच रहा था मैं एक सरणी के रूप में इस प्रकार है

var numbers = [9,7,12] 
var combos = [] 
for (var i = 0; i < numbers.length; i++) { 
    combos.push([numbers[i], numbers[i+1]) 
} 

वैसे है, संभव कॉम्बो

[9,7], [9,12] and [7,12] 
तो

हैं इस सरणी पर लंबाई कार्यप्रणाली को कॉल करके, 3 होगा लौटा हुआ।

कोई विचार?

+0

करता है ताकि इस मामले? यानी: [9,7] और [7, 9], क्या वे अलग मानते हैं? – EyeOfTheHawks

+0

मुझे लगता है कि इसे 'दोहराया संयोजन' माना जाएगा। उनमें से दोनों एक ही दो संख्याओं पर विचार करते हैं, इसलिए वे वही होना चाहिए। मैं विभिन्न संख्याओं के सभी संयोजनों की तलाश कर रहा हूं –

उत्तर

4

कैसे के बारे में:

for (var i = 0; i < numbers.length; i++) 
    for (var j = i + 1; j < numbers.length; j++) 
     combos.push([numbers[i], numbers[j]]); 
+0

शानदार समाधान। ऐसा लगता है कि यह एकाधिक रिकर्सन का उपयोग कर रहा है। धन्यवाद @JuniorCompressor –

+2

@ जोशविंटर यह लूप के लिए सिर्फ घोंसला है। कोई रिकर्सन – EyeOfTheHawks

+0

क्षमा करें, मेरा मतलब एकाधिक पुनरावृत्ति है। –

1

आप सख्ती से सरणी के बारे में 2-संयोजन बात कर रहे हैं या आप एक k- संयोजन समाधान में रुचि रखते हैं?

इस gist

function k_combinations(set, k) { 
var i, j, combs, head, tailcombs; 

if (k > set.length || k <= 0) { 
    return []; 
} 

if (k == set.length) { 
    return [set]; 
} 

if (k == 1) { 
    combs = []; 
    for (i = 0; i < set.length; i++) { 
     combs.push([set[i]]); 
    } 
    return combs; 
} 

// Assert {1 < k < set.length} 

combs = []; 
for (i = 0; i < set.length - k + 1; i++) { 
    head = set.slice(i, i+1); 
    tailcombs = k_combinations(set.slice(i + 1), k - 1); 
    for (j = 0; j < tailcombs.length; j++) { 
     combs.push(head.concat(tailcombs[j])); 
    } 
} 
return combs; 
} 
+0

यह प्रश्न विशेष रूप से 2 तत्वों के संयोजन के बारे में था। लेकिन धन्यवाद, यह भी उपयोगी हो सकता है –

+0

आप इसे संशोधित कर सकते हैं (वास्तव में इसे कम मॉड्यूलर और अधिक विशिष्ट बनाते हैं) आपकी आवश्यकताओं के लिए। –

0

में यह मिला यहाँ एक पुनरावर्ती क्रिया है, जो किसी भी संख्या के लिए काम करना चाहिए है:

function combination(arr, num) { 
    var r= []; 

    for(var i = 0 ; i < arr.length ; i++) { 
    if(num===1) r.push([arr[i]]); 
    else { 
     combination(arr.slice(i+1), num-1).forEach(function(val) { 
     r.push([].concat(arr[i], val)); 
     }); 
    } 
    } 
    return r; 
} //combination 

Working Fiddle

संबंधित मुद्दे