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

Reply via email to