ut2
Version:
一个现代 JavaScript 实用工具库。[点击查看在线文档]。
71 lines (68 loc) • 2.62 kB
JavaScript
import allKeys from './allKeys.js';
import getTag from './internals/getTag.js';
import { nativeUndefined, objectTag } from './internals/native.js';
import isEqualDeep from './internals/isEqualDeep.js';
function isDeepComparable(object, source) {
return getTag(object) === objectTag && getTag(source) === 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 !== 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 !== 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 !== nativeUndefined) {
return !!compared;
}
}
return baseIsMatch(object, source, customizer, strictCheck, nativeUndefined, nativeUndefined);
}
export { isMatch as default };