Add _.negate, _.keysIn and _.valuesIn.

This commit is contained in:
John-David Dalton
2014-03-06 00:42:51 -08:00
parent 0392e37eed
commit c6de1ab56c
2 changed files with 108 additions and 45 deletions

148
lodash.js
View File

@@ -4568,9 +4568,7 @@
*/ */
function reject(collection, predicate, thisArg) { function reject(collection, predicate, thisArg) {
predicate = lodash.createCallback(predicate, thisArg, 3); predicate = lodash.createCallback(predicate, thisArg, 3);
return filter(collection, function(value, index, collection) { return filter(collection, negate(predicate));
return !predicate(value, index, collection);
});
} }
/** /**
@@ -5930,26 +5928,21 @@
* this.y = 0; * this.y = 0;
* } * }
* *
* Shape.prototype.move = function(x, y) { * Shape.prototype.z = 0;
* this.x += x;
* this.y += y;
* };
* *
* _.forInRight(new Shape, function(value, key) { * _.forInRight(new Shape, function(value, key) {
* console.log(key); * console.log(key);
* }); * });
* // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move' * // => logs 'z', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'z'
*/ */
function forInRight(object, callback, thisArg) { function forInRight(object, callback, thisArg) {
var pairs = []; var props = keysIn(object),
baseForIn(object, function(value, key) { length = props.length;
pairs.push(key, value);
});
var length = pairs.length;
callback = baseCreateCallback(callback, thisArg, 3); callback = baseCreateCallback(callback, thisArg, 3);
while (length--) { while (length--) {
if (callback(pairs[length--], pairs[length], object) === false) { var prop = props[length];
if (callback(object[prop], prop, object) === false) {
break; break;
} }
} }
@@ -6568,6 +6561,35 @@
return nativeKeys(object); return nativeKeys(object);
}; };
/**
* Creates an array of the own and inherited enumerable property names of `object`.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to inspect.
* @returns {Array} Returns the array of property names.
* @example
*
* function Shape() {
* this.x = 0;
* this.y = 0;
* }
*
* Shape.prototype.z = 0;
*
* _.keysIn(new Shape);
* // => ['x', 'y', 'z'] (property order is not guaranteed across environments)
*/
function keysIn(object) {
var result = [];
baseForIn(object, function(value, key) {
result.push(key);
});
return result;
}
/** /**
* Creates an object with the same keys as `object` and values generated by * Creates an object with the same keys as `object` and values generated by
* running each own enumerable property of `object` through the callback. * running each own enumerable property of `object` through the callback.
@@ -6722,37 +6744,17 @@
* // => { 'name': 'fred' } * // => { 'name': 'fred' }
*/ */
function omit(object, predicate, thisArg) { function omit(object, predicate, thisArg) {
var result = {}; if (typeof predicate == 'function') {
if (typeof predicate != 'function') {
var omitProps = baseFlatten(arguments, true, false, 1),
length = omitProps.length;
while (length--) {
omitProps[length] = String(omitProps[length]);
}
var props = [];
baseForIn(object, function(value, key) {
props.push(key);
});
var index = -1;
props = baseDifference(props, omitProps);
length = props.length;
while (++index < length) {
var key = props[index];
result[key] = object[key];
}
} else {
predicate = lodash.createCallback(predicate, thisArg, 3); predicate = lodash.createCallback(predicate, thisArg, 3);
baseForIn(object, function(value, key, object) { return pick(object, negate(predicate));
if (!predicate(value, key, object)) {
result[key] = value;
}
});
} }
return result; var omitProps = baseFlatten(arguments, true, false, 1),
length = omitProps.length;
while (length--) {
omitProps[length] = String(omitProps[length]);
}
return pick(object, baseDifference(keysIn(object), omitProps));
} }
/** /**
@@ -6918,6 +6920,36 @@
return result; return result;
} }
/**
* Creates an array composed of the own and inherited enumerable property
* values of `object`.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to inspect.
* @returns {Array} Returns the new array of property values.
* @example
*
* function Shape(x, y) {
* this.x = x;
* this.y = y;
* }
*
* Shape.prototype.z = 0;
*
* _.valuesIn(new Shape(2, 1));
* // => [2, 1, 0] (property order is not guaranteed across environments)
*/
function valuesIn(object) {
var result = [];
baseForIn(object, function(value) {
result.push(value);
});
return result;
}
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
/** /**
@@ -7842,6 +7874,33 @@
} }
} }
/**
* Creates a function that negates the result of `func`. The `func` function
* is executed with the `this` binding and arguments of the created function.
*
* @static
* @memberOf _
* @category Utilities
* @param {Function} func The function to negate.
* @returns {Function} Returns the new function.
* @example
*
* function isEven(num) {
* return num % 2 == 0;
* }
*
* _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
* // => [1, 3, 5]
*/
function negate(func) {
if (!isFunction(func)) {
throw new TypeError;
}
return function() {
return !func.apply(this, arguments);
};
}
/** /**
* Reverts the '_' variable to its previous value and returns a reference to * Reverts the '_' variable to its previous value and returns a reference to
* the `lodash` function. * the `lodash` function.
@@ -8148,6 +8207,7 @@
lodash.invert = invert; lodash.invert = invert;
lodash.invoke = invoke; lodash.invoke = invoke;
lodash.keys = keys; lodash.keys = keys;
lodash.keysIn = keysIn;
lodash.map = map; lodash.map = map;
lodash.mapValues = mapValues; lodash.mapValues = mapValues;
lodash.matches = matches; lodash.matches = matches;
@@ -8155,6 +8215,7 @@
lodash.memoize = memoize; lodash.memoize = memoize;
lodash.merge = merge; lodash.merge = merge;
lodash.min = min; lodash.min = min;
lodash.negate = negate;
lodash.omit = omit; lodash.omit = omit;
lodash.once = once; lodash.once = once;
lodash.pairs = pairs; lodash.pairs = pairs;
@@ -8180,6 +8241,7 @@
lodash.union = union; lodash.union = union;
lodash.uniq = uniq; lodash.uniq = uniq;
lodash.values = values; lodash.values = values;
lodash.valuesIn = valuesIn;
lodash.where = where; lodash.where = where;
lodash.without = without; lodash.without = without;
lodash.wrap = wrap; lodash.wrap = wrap;

View File

@@ -9264,6 +9264,7 @@
'defer', 'defer',
'delay', 'delay',
'memoize', 'memoize',
'negate',
'once', 'once',
'partial', 'partial',
'partialRight', 'partialRight',
@@ -9274,7 +9275,7 @@
var acceptFalsey = _.difference(allMethods, rejectFalsey); var acceptFalsey = _.difference(allMethods, rejectFalsey);
test('should accept falsey arguments', 182, function() { test('should accept falsey arguments', 184, function() {
var emptyArrays = _.map(falsey, function() { return []; }), var emptyArrays = _.map(falsey, function() { return []; }),
isExposed = '_' in root, isExposed = '_' in root,
oldDash = root._; oldDash = root._;
@@ -9343,7 +9344,7 @@
}); });
}); });
test('should reject falsey arguments', 14, function() { test('should reject falsey arguments', 15, function() {
_.forEach(rejectFalsey, function(methodName) { _.forEach(rejectFalsey, function(methodName) {
var expected = _.map(falsey, function() { return true; }), var expected = _.map(falsey, function() { return true; }),
func = _[methodName]; func = _[methodName];