2013-07-30 65 views
6

Hãy xem xét các mảng sau:JS gọi hàm với tất cả các đối số có thể hoán vị

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

Tôi muốn gọi hàm của tôi myFunc(arg1, arg2, arg3) với tất cả các kết hợp lý luận. Nhưng tôi muốn tránh địa ngục "foreach".

Có thể chức năng ghi cho phép tôi rằng, vì vậy tôi có thể gọi nó là một số như:

cartesianCall(array1, array2, array3, myFunc); 

lý tưởng với số lượng biến của mảng (MyFunc arguments)?

EDIT: nên chức năng sẽ được gọi là:

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

bạn có muốn hợp nhất mảng của mình thành một không ?? –

+0

Tôi muốn thực hiện nhiều thao tác trong "myFunc" với các đối số .. –

+0

Và bạn muốn tránh các vòng lặp 'for' lồng nhau? – tymeJV

Trả lời

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

Sau đó sử dụng nó như thế này :

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

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

Prints:

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

ý rằng mảng trống được đối xử giống như undefined.

+0

Khi bất kỳ mảng nào là một danh sách trống, nó không hoán đổi, nó sẽ có thể hoán vị với giá trị là null – zsong

+0

Điểm tốt. Tôi nghĩ rằng chỉnh sửa sẽ chăm sóc của trường hợp cạnh đó. –

+0

Tôi điều rằng khi một mảng trống, hàm sẽ không được gọi là –

5

Declare bạn hoạt động không có tham số và sử dụng arguments keyword:

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

Đây là cách tốt nhất để đi về mọi thứ, chỉ cần cẩn thận để không xác định bất kỳ chức năng trợ giúp nào trong vòng lặp. –

+2

Điều này không thực sự trả lời câu hỏi. Anh ta vẫn cần phải làm rất nhiều vòng lặp khó chịu trong đó. –

+0

@TrevorDixon Câu trả lời của tôi đã được đăng trước khi câu hỏi OP được cập nhật với thông tin bổ sung. Vì vậy, đây là câu trả lời cho câu hỏi: * Có thể viết chức năng cho phép tôi rằng, vì vậy tôi có thể gọi nó một số như: cartesianCall (array1, array2, array3, myFunc); * –

Các vấn đề liên quan