JS call function with all possible arguments

Consider the following arrays:

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

I want to call my function myFunc(arg1, arg2, arg3) with all combinations of arguments. But I want to avoid "chasing" hell.

Is there a recording function that allows me to do this, so I can call it the following:

 cartesianCall(array1, array2, array3, myFunc); 

ideally with a variable number of arrays (myFunc arguments)?

EDIT: so the function will be called:

 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"); 
+6
source share
2 answers

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

Then use it as follows:

 function printArgs() { console.log('Called with arguments:', arguments); } cartesianCall(printArgs, [ [true, false], undefined, [1, 2], [], 'a string', ['a', 'b', 'c'] ]); 

Print

 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"] 

Note that empty arrays are treated in the same way as undefined .

+3
source

Declare a function with no parameters and use the arguments keyword:

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

Source: https://habr.com/ru/post/950655/


All Articles