To be a tad picky, uniq is only part of Array, not Enumerable in Ruby.
On 8/14/06, Hill, Greg <[EMAIL PROTECTED]> wrote:
I agree with Ryan, uniq saves you two letters and makes you cringe every time you write or read it. Ruby should seriously fix that. Greg ________________________________ From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Ryan Gahl Sent: Monday, August 14, 2006 8:08 AM To: rails-spinoffs@lists.rubyonrails.org Subject: Re: [Rails-spinoffs] Prototype $$ Question BUT, wait just a second Thomas :-) Remember a lot of us aren't Ruby-jockies... keep the function names _descriptive_ please :-) "unique" is better than uniq IMHO On 8/14/06, Thomas Fuchs <[EMAIL PROTECTED]> wrote: That method should be named "uniq" (to match the ruby enumerables, which Prototype heavily borrows from), and should be added to the Prototype enumerables-- seems like a nice extension. :) -Thomas Am 14.08.2006 um 00:06 schrieb Martin Ström: > And the little more elegant, prototypish way ;) > > Object.extend(Array.prototype, { > unique: function() { > return this.inject ([], function(array, value) { > if (!array.include(value)) array.push (value); > return array; > }); > } > }); > > _$$_old = $$; > > function $$() {return _$$_old.apply(null, arguments).unique()} > > Ciao > Martin > > On 8/13/06, Brian Peiris <[EMAIL PROTECTED]> wrote: > Hey Sam, Seth, > thank you both for your replies. > Seth: > Now I see why $$('#tree .node .nodeChildren') returns duplicates, > and it looks like $$('#tree > .node > .nodeChildren') doesn't work > ($$ probably doesn't support direct decendents yet, it returns and > empty array). > $$(' .nodeChildren') wouldn't work for me, elements with class > '.nodeChildren' could be under two different trees ('#tree1' and > '#tree2' for example). > > Sam: > I agree with you, I discovered this problem while using > event:Selectors to toggle an element on a click event, it took me a > while to figure out that the toggle function was being called > twice. It is un-intuitive that $$ returns duplicates, even though > it is technically correct, I don't see where it would be useful, > especially since it doesn't support direct descendants yet. > Perhaps it is a bug, or perhaps we just have to wait till more > advanced CSS selectors are supported > > Anyway, > I just added few lines to the $$ function to return a unique array. > If anyone wants to take a look at it quickly, there's probably a > better way to do it (using prototype's array functions) > > > function $$() { > var nodes = $A(arguments).map(function(expression) { > return expression.strip ().split(/\s+/).inject([null], function > (results, expr) { > var selector = new Selector(expr); > return results.map(selector.findElements.bind > (selector)).flatten(); > }); > }).flatten(); > var uniqueNodes =[]; > var i=0; > for(i=0;i<nodes.length;i++){ > if(uniqueNodes.indexOf(nodes[i])==-1) > { > uniqueNodes.push(nodes[i]); > } > } > return uniqueNodes; > } > > Thanks, > Brian > > On 8/13/06, Seth Dillingham <[EMAIL PROTECTED]> wrote: On > 8/13/06, Sam wrote: > > > The node id node_3_children satisfies the criteria $('#tree .node > > .nodeChildren') once for nodeID node_1, and once again for nodeID > node_3. > > The problem here is #tree .node .nodeChildren allows any number > of elements > > to appear between these attributes: e.g., there may be 3 <div > > class="node">, all of class .node, between #tree .node > and .nodeChildren. > > If you want to specify direct descendents only, you could try $$ > ('#tree > > > .node > .nodeChildren'), but I don't know if $$ supports direct > descendents. > > It probably does, but I've never had the opportunity to test. > In my > > experience, nothing works until you see it work. > > Sam, > > I think his point is that he wants a unique list from $$. It doesn't > matter if there are ten ways to get to the same element, it should be > checking to make sure an item is NOT already in the list before > pushing it onto the list. > > You'd find it very frustrating if getElementsByTagName() returned the > same element more than once in the result list. That's because you > usually want to *do* something with the items in the list, and you > don't want to process any of them more than once. > > If getElementsByTagName() did return some elements more than once, and > the browser vendors explained that the reason is because of how they > build the list, we'd all be quite disgusted. In this case, knowing WHY > $$ returns the same element twice doesn't matter... that's not what we > expect the function to do. > > Looks like a bug to me, Brian. > > Seth > _______________________________________________ > Rails-spinoffs mailing list > Rails-spinoffs@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs > > > > -- > ============================ > Brian Peiris > Brampton, Ontario, Canada > [EMAIL PROTECTED] or [EMAIL PROTECTED] > ============================ > > _______________________________________________ > Rails-spinoffs mailing list > Rails-spinoffs@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs > > > > > > -- > burnfield.com/martin > _______________________________________________ > Rails-spinoffs mailing list > Rails-spinoffs@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs _______________________________________________ Rails-spinoffs mailing list Rails-spinoffs@lists.rubyonrails.org http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs _______________________________________________ Rails-spinoffs mailing list Rails-spinoffs@lists.rubyonrails.org http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs
_______________________________________________ Rails-spinoffs mailing list Rails-spinoffs@lists.rubyonrails.org http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs