Skip to main content

Bug Tracker

Side navigation

#8689 closed enhancement (worksforme)

Opened March 29, 2011 09:31AM UTC

Closed March 29, 2011 12:19PM UTC

Last modified March 29, 2011 03:14PM UTC

Add .collect() function that creates new collection out of existing one

Reported by: igor.nikolaev@nikisoft.ru Owned by:
Priority: undecided Milestone: 1.next
Component: unfiled Version: 1.5.1
Keywords: Cc:
Blocked by: Blocking:
Description

I would like to contribute the following function to the jQuery core:

(function($) {
    $.fn.collect = function(callback) {
        if (typeof(callback) == "function") {
            var collection = [];

            $(this).each(function() {
                var item = callback.apply(this);

                if (item)
                    collection.push(item);
            });

            return collection;
        }

        return this;
    }
})(jQuery);

This function lets create a collection out of other collection with capability to filter initial collection. Consider the following example:

var colors = $("input.color").collect(function(){return this.name});

This example creates new collection of strings containing values of name attribute of inputs returned by 'input.color' selector.

It is also possible to filter collection:

var colors = $("input.color").collect(function(){if (this.name != "Blue") return this.name});
Attachments (0)
Change History (4)

Changed March 29, 2011 12:19PM UTC by dmethvin comment:1

resolution: → worksforme
status: newclosed

That is describing the .filter() method, as far as I can tell. All jQuery methods that filter or select new elements create a new jQuery object, rather than modifying the old one. The implementation is flawed because it doesn't return a jQuery object.

If you'd like to ask more questions, please open a thread on the Using jQuery section of forum.jquery.com. Thanks!

Changed March 29, 2011 12:46PM UTC by igor.nikolaev@nikisoft.ru comment:2

No, .filter() method returns filtered collection of the same objects:

var input = $(".input").filter(function() {return true})

This still returns the collections of input objects.

And intension of .collect() method is to create a completely different collection with items of different type that initial one:

var colors = $("input.color").collect(function(){return this.name});

This will create an array of strings which containt the contents of name attribute of input.

Else I would have to write the following ugly code:

var colors = [];
$("input.color").each(function(){colors.push(this.name)});

My use case is following:

1. find inputs by selector

2. get names of inputs that match selector as a collection

Changed March 29, 2011 02:54PM UTC by igor.nikolaev@nikisoft.ru comment:3

I have created an example on jsFiddle: http://jsfiddle.net/B8jxU/6/

Replying to [comment:1 dmethvin]:

That is describing the .filter() method, as far as I can tell. All jQuery methods that filter or select new elements create a new jQuery object, rather than modifying the old one. The implementation is flawed because it doesn't return a jQuery object. If you'd like to ask more questions, please open a thread on the Using jQuery section of forum.jquery.com. Thanks!

Changed March 29, 2011 03:14PM UTC by dmethvin comment:4

You can do that with .map. http://jsfiddle.net/dmethvin/B8jxU/7/