Ensure has treats nested sparse arrays consistently.

This commit is contained in:
John-David Dalton
2016-03-31 19:25:40 -07:00
parent 642d248f99
commit 3902fd1a67
2 changed files with 27 additions and 22 deletions

View File

@@ -5343,29 +5343,24 @@
* @returns {boolean} Returns `true` if `path` exists, else `false`.
*/
function hasPath(object, path, hasFunc) {
if (object == null) {
return false;
}
var result = hasFunc(object, path);
if (!result && !isKey(path)) {
path = baseCastPath(path);
path = isKey(path, object) ? [path] : baseCastPath(path);
var index = -1,
length = path.length;
var index = -1,
length = path.length;
while (++index < length) {
var key = path[index];
if (!(result = object != null && hasFunc(object, key))) {
break;
}
object = object[key];
while (++index < length) {
var key = path[index];
if (!(result = object != null && hasFunc(object, key))) {
break;
}
object = object[key];
}
var length = object ? object.length : undefined;
return result || (
!!length && isLength(length) && isIndex(path, length) &&
(isArray(object) || isString(object) || isArguments(object))
);
if (result) {
return result;
}
var length = object ? object.length : 0;
return !!length && isLength(length) && isIndex(key, length) &&
(isArray(object) || isString(object) || isArguments(object));
}
/**
@@ -12048,7 +12043,7 @@
* // => false
*/
function has(object, path) {
return hasPath(object, path, baseHas);
return object != null && hasPath(object, path, baseHas);
}
/**
@@ -12078,7 +12073,7 @@
* // => false
*/
function hasIn(object, path) {
return hasPath(object, path, baseHasIn);
return object != null && hasPath(object, path, baseHasIn);
}
/**

View File

@@ -7243,7 +7243,7 @@
});
QUnit.test('`_.' + methodName + '` should return `true` for index values within bounds for arrays, `arguments` objects, and strings', function(assert) {
assert.expect(1);
assert.expect(2);
var string = Object('abc');
delete args[0];
@@ -7256,6 +7256,16 @@
return func(value, 0);
});
assert.deepEqual(actual, expected);
expected = lodashStable.map(values, lodashStable.constant([true, true]));
actual = lodashStable.map(values, function(value) {
return lodashStable.map(['a[0]', ['a', '0']], function(path) {
return func({ 'a': value }, path);
});
});
assert.deepEqual(actual, expected);
args[0] = 1;
});