Make _.result resolve values of functions as it deep crawls over them.

This commit is contained in:
John-David Dalton
2016-03-23 00:44:36 -07:00
parent 8d93455076
commit f65d36b3c1
2 changed files with 26 additions and 26 deletions

View File

@@ -12282,17 +12282,24 @@
* // => 'default' * // => 'default'
*/ */
function result(object, path, defaultValue) { function result(object, path, defaultValue) {
if (!isKey(path, object)) { path = isKey(path, object) ? [path] : baseCastPath(path);
path = baseCastPath(path);
var result = baseGet(object, path); var index = -1,
object = parent(object, path); length = path.length;
} else {
result = object == null ? undefined : object[path]; if (!length) {
object = undefined;
length = 1;
} }
if (result === undefined) { while (++index < length) {
result = defaultValue; var value = object == null ? undefined : object[path[index]];
if (value === undefined) {
index = length;
value = defaultValue;
}
object = value = isFunction(value) ? value.call(object) : value;
} }
return isFunction(result) ? result.call(object) : result; return value;
} }
/** /**

View File

@@ -18301,28 +18301,15 @@
}); });
QUnit.test('`_.' + methodName + '` should follow `path` over non-plain objects', function(assert) { QUnit.test('`_.' + methodName + '` should follow `path` over non-plain objects', function(assert) {
assert.expect(4); assert.expect(2);
var object = { 'a': '' }, var paths = ['a.b.c', ['a', 'b', 'c']];
paths = ['constructor.prototype.a', ['constructor', 'prototype', 'a']];
lodashStable.each(paths, function(path) { lodashStable.each(paths, function(path) {
numberProto.a = 1; numberProto.a = { 'b': { 'c': 1 } };
assert.strictEqual(func(0, path), 1);
var actual = func(0, path);
assert.strictEqual(actual, 1);
delete numberProto.a; delete numberProto.a;
}); });
lodashStable.each(['a.replace.b', ['a', 'replace', 'b']], function(path) {
stringProto.replace.b = 1;
var actual = func(object, path);
assert.strictEqual(actual, 1);
delete stringProto.replace.b;
});
}); });
QUnit.test('`_.' + methodName + '` should return the default value for `undefined` values', function(assert) { QUnit.test('`_.' + methodName + '` should return the default value for `undefined` values', function(assert) {
@@ -18346,6 +18333,12 @@
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
QUnit.test('`_.' + methodName + '` should return the default value when `path` is empty', function(assert) {
assert.expect(1);
assert.strictEqual(func({}, [], 'a'), 'a');
});
}); });
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/