最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Copying a subset of the arguments object, without using an explicit loop - Stack Overflow

programmeradmin3浏览0评论

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]);
    });
}
发布评论

评论列表(0)

  1. 暂无评论