function isEqual(objA, objB, config) { function isComparableKey(key) { return (config.ignore || []).indexOf(key) < 0; } var aProps = Object.getOwnPropertyNames(objA).filter(isComparableKey); var bProps = Object.getOwnPropertyNames(objB).filter(isComparableKey); if (aProps.length !== bProps.length) { return false; } for (var i = 0; i < aProps.length; i++) { var propName = aProps[i]; var propA = aProps[propName]; var propB = bProps[propName]; if (config.shallow) { if (propA !== propB) { return false; } } else { if (typeof propA === 'object') { if (!isEqual(propA, propB)) { return false; } } else { if (propA !== propB) { return false; } } } } return true; }