ut2
Version:
一个现代 JavaScript 实用工具库。[点击查看在线文档]。
73 lines (69 loc) • 2.67 kB
JavaScript
;
var allKeys = require('./allKeys.js');
var getTag = require('./internals/getTag.js');
var native = require('./internals/native.js');
var isEqualDeep = require('./internals/isEqualDeep.js');
function isDeepComparable(object, source) {
return getTag(object) === native.objectTag && getTag(source) === native.objectTag;
}
function baseIsMatch(object, source, customizer, strictCheck, objStack, srcStack) {
var hasCustomizer = typeof customizer === 'function';
if (isDeepComparable(object, source)) {
objStack = objStack || [];
srcStack = srcStack || [];
var stackLen = objStack.length;
while (stackLen--) {
if (objStack[stackLen] === object && srcStack[stackLen] === source) {
return true;
}
}
objStack.push(object);
srcStack.push(source);
var keys = allKeys(source);
var length_1 = keys.length;
while (length_1--) {
var key = keys[length_1];
if (!(key in object)) {
return false;
}
if (hasCustomizer) {
var compared = customizer(object[key], source[key], key, object, source, objStack, srcStack);
if (compared !== native.nativeUndefined) {
if (!compared) {
return false;
}
continue;
}
}
if (!baseIsMatch(object[key], source[key], customizer, strictCheck, objStack, srcStack)) {
return false;
}
}
objStack.pop();
srcStack.pop();
return true;
}
var result = isEqualDeep(object, source, function (objValue, srcValue, k, obj, src) {
if (hasCustomizer) {
var compared = customizer(objValue, srcValue, k, obj, src, objStack, srcStack);
if (compared !== native.nativeUndefined) {
return compared;
}
}
if (isDeepComparable(objValue, srcValue)) {
return baseIsMatch(objValue, srcValue, customizer, strictCheck, objStack, srcStack);
}
}, strictCheck, objStack, srcStack);
return result;
}
function isMatch(object, source, customizer, strictCheck) {
if (strictCheck === void 0) { strictCheck = false; }
if (typeof customizer === 'function') {
var compared = customizer(object, source);
if (compared !== native.nativeUndefined) {
return !!compared;
}
}
return baseIsMatch(object, source, customizer, strictCheck, native.nativeUndefined, native.nativeUndefined);
}
module.exports = isMatch;