2013-07-30 27 views
6

सरणियों निम्नलिखित पर विचार करें:जे एस कॉल समारोह permuted

var array1 = [true, false]; 
var array2 = [1, 2]; 
var array3 = ["a", "b", "c"]; 

मैं अपने समारोह myFunc(arg1, arg2, arg3) सभी तर्क संयोजनों के साथ कॉल करना चाहते हैं। लेकिन मैं नरक "foreach" से बचना चाहता हूँ।

यह संभव लिखने समारोह है कि मुझे उस की अनुमति देता है है, इसलिए मैं यह कॉल कर सकते हैं कुछ की तरह:

cartesianCall(array1, array2, array3, myFunc); 

सरणियों (myFunc तर्क) के चर गिनती के साथ आदर्श?

संपादित करें: तो समारोह कहा जा सकता है: क्या आप मानकों के बिना कार्य और arguments कीवर्ड का उपयोग

myFunc(true, 1, "a"); 
myFunc(true, 1, "b"); 
myFunc(true, 1, "c"); 
myFunc(true, 2, "a"); 
myFunc(true, 2, "b"); 
myFunc(true, 2, "c"); 
myFunc(false, 1, "a"); 
myFunc(false, 1, "b"); 
myFunc(false, 1, "c"); 
myFunc(false, 2, "a"); 
myFunc(false, 2, "b"); 
myFunc(false, 2, "c"); 
+0

क्या आप अपनी सरणी को एक में फ्यूज करना चाहते हैं ?? –

+0

मैं तर्क के साथ "myFunc" में कई संचालन करना चाहता हूं .. –

+0

और आप नेस्टेड 'फॉर लूप' से बचना चाहते हैं? – tymeJV

उत्तर

3

http://jsfiddle.net/trevordixon/zEqKy/

function cartesianCall(func, args) { 
    var combos = allCombos.apply(this, args); 

    for (var i = 0; i < combos.length; i++) { 
     func.apply(null, combos[i]); 
    } 
} 

function allCombos(first) { 
    var isArray = toString.call(first) === "[object Array]"; 
    if (!isArray) first = [first]; // Convert non-array to an array with the value 
            // as the only element 
    else if (first.length === 0) first = [undefined]; // Convert empty array to an 
                 // array with undefined as 
                 // the only element 

    if (arguments.length === 1) return first; // base case for recursion 

    var result = [], 
     rest = allCombos.apply(this, Array.prototype.slice.call(arguments, 1)); 

    for (var i = 0; i < first.length; i++) { 
     for (var j = 0; j < rest.length; j++) { 
      result.push([first[i]].concat(rest[j])); 
     } 
    } 

    return result; 
} 

तो इस तरह इसका इस्तेमाल :

function printArgs() { console.log('Called with arguments:', arguments); } 

cartesianCall(printArgs, [ 
    [true, false], 
    undefined, 
    [1, 2], 
    [], 
    'a string', 
    ['a', 'b', 'c'] 
]); 

प्रिंटों:

Called with arguments: [true, undefined, 1, undefined, "a string", "a"] 
Called with arguments: [true, undefined, 1, undefined, "a string", "b"] 
Called with arguments: [true, undefined, 1, undefined, "a string", "c"] 
Called with arguments: [true, undefined, 2, undefined, "a string", "a"] 
Called with arguments: [true, undefined, 2, undefined, "a string", "b"] 
Called with arguments: [true, undefined, 2, undefined, "a string", "c"] 
Called with arguments: [false, undefined, 1, undefined, "a string", "a"] 
Called with arguments: [false, undefined, 1, undefined, "a string", "b"] 
Called with arguments: [false, undefined, 1, undefined, "a string", "c"] 
Called with arguments: [false, undefined, 2, undefined, "a string", "a"] 
Called with arguments: [false, undefined, 2, undefined, "a string", "b"] 
Called with arguments: [false, undefined, 2, undefined, "a string", "c"] 

सूचना है कि खाली सरणियों undefined के रूप में ही देखा जाता है।

+0

जब कोई सरणी खाली सूची है, तो यह अनुमति नहीं देता है, यह शून्य – zsong

+0

अच्छा बिंदु मान के साथ अनुमति देने में सक्षम होना चाहिए। मुझे लगता है कि संपादन उस किनारे के मामले का ख्याल रखता है। –

+0

मुझे बात है कि जब सरणी में से एक खाली है, तो फ़ंक्शन को –

5

घोषणा:

function cartesianCall() { 
    for (var i = 0; i < arguments.length; i++) { 
    // do something with arguments[i] 
    } 
} 
+0

चीजों के बारे में जाने का यह सबसे अच्छा तरीका है, बस सावधान रहें कि लूप के भीतर किसी भी सहायक कार्यों को परिभाषित न करें। –

+2

यह वास्तव में प्रश्न का उत्तर नहीं देता है। उसे अभी भी वहां बहुत बुरा लूपिंग करने की आवश्यकता होगी। –

+0

@TrevorDixon मेरा उत्तर पोस्ट किया गया था इससे पहले कि ओपी प्रश्न अतिरिक्त जानकारी के साथ अद्यतन किया गया था। तो यह सवाल का जवाब है: * क्या यह संभव लेखन कार्य है जो मुझे अनुमति देता है, इसलिए मैं इसे कुछ कह सकता हूं: कार्टेशियन कॉल (सरणी 1, सरणी 2, सर 3, myFunc); * –

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