admin管理员组

文章数量:1327660

I have a JavaScript function that takes two required parameters and then arbitrarily many optional parameters.

function myFunction(required1, required2) {
    var more = [];
    for (var i = 2; i < arguments.length; ++i)
        more.push(arguments[i]);
    // ...
}

Now, I like enforcing a consistent style through all my code. Since my site uses jQuery, and jQuery favors using $.each and $.map over explicit loops, I want to get rid of the explicit loop in myFunction. However, I cannot use either $.each or $.map because I don't want to copy the whole argument list, lest I do the following:

var more = $.map(arguments, function(argument, index) {
    return (index < 2) ? null : [argument];
});

Which is, of course, a very bad idea, because testing whether index < 2 in every iteration is unnecessary.

I would really like to be able to extract a subset of the arguments object into a new array, using a standard function. However, because arguments is not an array, I cannot slice it.

Is there any other way I could extract into an array all arguments but the two first ones, without using an explicit loop, and without losing efficiency?

I have a JavaScript function that takes two required parameters and then arbitrarily many optional parameters.

function myFunction(required1, required2) {
    var more = [];
    for (var i = 2; i < arguments.length; ++i)
        more.push(arguments[i]);
    // ...
}

Now, I like enforcing a consistent style through all my code. Since my site uses jQuery, and jQuery favors using $.each and $.map over explicit loops, I want to get rid of the explicit loop in myFunction. However, I cannot use either $.each or $.map because I don't want to copy the whole argument list, lest I do the following:

var more = $.map(arguments, function(argument, index) {
    return (index < 2) ? null : [argument];
});

Which is, of course, a very bad idea, because testing whether index < 2 in every iteration is unnecessary.

I would really like to be able to extract a subset of the arguments object into a new array, using a standard function. However, because arguments is not an array, I cannot slice it.

Is there any other way I could extract into an array all arguments but the two first ones, without using an explicit loop, and without losing efficiency?

Share Improve this question asked May 5, 2011 at 16:41 isekaijinisekaijin 19.8k19 gold badges87 silver badges154 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 10

Using the slice method:

var optional_arguments = Array.prototype.slice.call(arguments, 2);

We have to call it from Array.prototype because, even though arguments is array-like, it doesn't actually have a slice method.

The arguments of a function can be treated like an array with jQuery, for instance the following works perfectly fine:

function something(ar1,ar2){
    var args = $(arguments).slice(2);
    $(args).each(function(i){
        $('#stuff').append(args[i]+'<br />');
    });
}
$(function(){
    something('one','two','three','four');
});

And to tailor it to your function above it would look like this:

function myFunction(required1, required2) {
    var more = [];
    var args = $(arguments).slice(2);
    $(args).each(function(i){
        more.push(args[i]);
    });
}

本文标签: