diff --git a/index.html b/index.html index 7d17a1277..7cabf46e6 100644 --- a/index.html +++ b/index.html @@ -1014,6 +1014,19 @@ _.functions(_);
 _.extend({name : 'moe'}, {age : 50});
 => {name : 'moe', age : 50}
+
+ +

+ restrict_.restrict(source, *keys) +
+ Return a clone of the source with only the properties with the + property names, or arrays of property names, provided in keys. +

+
+_.restrict({name : 'moe', age: 50, userid : 'moe1'}, 'name', 'age');
+=> {name : 'moe', age : 50}
+_.restrict({name : 'moe', age: 50, userid : 'moe1'}, ['name', 'age']);
+=> {name : 'moe', age : 50}
 

diff --git a/test/objects.js b/test/objects.js index 1745d8a3f..422e75754 100644 --- a/test/objects.js +++ b/test/objects.js @@ -41,6 +41,16 @@ $(document).ready(function() { equal(_.keys(result).join(''), 'ab', 'extend does not copy undefined values'); }); + test("objects: restrict", function() { + var result; + result = _.restrict({a:1, b:2, c:3}, 'a', 'c'); + ok(_.isEqual(result, {a:1, c:3}), 'can restrict properties to those named'); + result = _.restrict({a:1, b:2, c:3}, ['b', 'c']); + ok(_.isEqual(result, {b:2, c:3}), 'can restrict properties to those named in an array'); + result = _.restrict({a:1, b:2, c:3}, ['a'], 'b'); + ok(_.isEqual(result, {a:1, b:2}), 'can restrict properties to those named in mixed args'); + }); + test("objects: defaults", function() { var result; var options = {zero: 0, one: 1, empty: "", nan: NaN, string: "string"}; diff --git a/underscore.js b/underscore.js index f1f816da8..12423c7e5 100644 --- a/underscore.js +++ b/underscore.js @@ -648,6 +648,16 @@ return obj; }; + // Restrict a given object to the properties named + _.restrict = function(obj) { + if (obj !== Object(obj)) throw new TypeError('Invalid object'); + var dest = {}; + each(_.flatten(slice.call(arguments, 1)), function(prop) { + if (prop in obj) dest[prop] = obj[prop]; + }); + return dest; + }; + // Fill in a given object with default properties. _.defaults = function(obj) { each(slice.call(arguments, 1), function(source) {