prototype: Extended grep semantics. The first argument to Enumerable#grep is now a filter (an object with a match() method) so you can now e.g. filter an array of DOM nodes by CSS selector. Closes #7596.

This commit is contained in:
Sam Stephenson 2007-07-24 16:47:12 +00:00
parent 38fa39af92
commit b59399bdd3
4 changed files with 23 additions and 4 deletions

View File

@ -1,5 +1,7 @@
*SVN*
* Extended grep semantics. The first argument to Enumerable#grep is now a "filter" (an object with a match() method) so you can now e.g. filter an array of DOM nodes by CSS selector. RegExp#match is now an alias to RegExp#test, so grep can still be used to filter an array of strings with a regular expression. Closes #7596. [Christophe Porteneuve, sam]
* Make String#scan explicitly return a string. This prevents possible issues with methods expecting input data that is typeof == 'string'. Closes #6350. [AndrewRev, Tobie Langel]
* Add Array#intersect for set intersection. Returns a new array containing all items common to the array and the argument, with duplicates removed (clone of the Ruby & method). [Thomas Fuchs]

View File

@ -140,6 +140,8 @@ var Try = {
}
}
RegExp.prototype.match = RegExp.prototype.test;
/*--------------------------------------------------------------------------*/
var PeriodicalExecuter = Class.create();

View File

@ -73,12 +73,15 @@ var Enumerable = {
return results;
},
grep: function(pattern, iterator, context) {
grep: function(filter, iterator, context) {
iterator = iterator ? iterator.bind(context) : Prototype.K;
var results = [];
if (typeof filter == "string")
filter = new RegExp(filter);
this.each(function(value, index) {
var stringValue = value.toString();
if (stringValue.match(pattern))
if (filter.match(value))
results.push(iterator(value, index));
});
return results;

View File

@ -23,6 +23,15 @@
<!-- Log output -->
<div id="testlog"> </div>
<table id="grepTable">
<tbody id="grepTBody">
<tr id="grepRow">
<th id="grepHeader" class="cell"></th>
<td id="grepCell" class="cell"></td>
</tr>
</tbody>
</table>
<!-- Tests follow -->
<script type="text/javascript" language="javascript" charset="utf-8">
// <![CDATA[
@ -182,6 +191,9 @@
Fixtures.Nicknames.grep(/o/, function(nickname) {
return nickname.toUpperCase();
}).join(", "))
assertEnumEqual($('grepHeader', 'grepCell'),
$('grepTable', 'grepTBody', 'grepRow', 'grepHeader', 'grepCell').grep(new Selector('.cell')));
}},
testInclude: function() {with(this) {
@ -309,4 +321,4 @@
// ]]>
</script>
</body>
</html>
</html>