bootstrap-vue
Version:
BootstrapVue, with more than 85 custom components, over 45 plugins, several custom directives, and over 300 icons, provides one of the most comprehensive implementations of Bootstrap v4 components and grid system for Vue.js. With extensive and automated W
62 lines (58 loc) • 1.73 kB
JavaScript
import { keys } from './object'
import { isArray, isDate, isObject } from './inspect'
// Assumes both a and b are arrays!
// Handles when arrays are "sparse" (array.every(...) doesn't handle sparse)
const compareArrays = (a, b) => {
if (a.length !== b.length) {
return false
}
let equal = true
for (let i = 0; equal && i < a.length; i++) {
equal = looseEqual(a[i], b[i])
}
return equal
}
/**
* Check if two values are loosely equal - that is,
* if they are plain objects, do they have the same shape?
* Returns boolean true or false
*/
const looseEqual = (a, b) => {
if (a === b) {
return true
}
let aValidType = isDate(a)
let bValidType = isDate(b)
if (aValidType || bValidType) {
return aValidType && bValidType ? a.getTime() === b.getTime() : false
}
aValidType = isArray(a)
bValidType = isArray(b)
if (aValidType || bValidType) {
return aValidType && bValidType ? compareArrays(a, b) : false
}
aValidType = isObject(a)
bValidType = isObject(b)
if (aValidType || bValidType) {
/* istanbul ignore if: this if will probably never be called */
if (!aValidType || !bValidType) {
return false
}
const aKeysCount = keys(a).length
const bKeysCount = keys(b).length
if (aKeysCount !== bKeysCount) {
return false
}
for (const key in a) {
// eslint-disable-next-line no-prototype-builtins
const aHasKey = a.hasOwnProperty(key)
// eslint-disable-next-line no-prototype-builtins
const bHasKey = b.hasOwnProperty(key)
if ((aHasKey && !bHasKey) || (!aHasKey && bHasKey) || !looseEqual(a[key], b[key])) {
return false
}
}
}
return String(a) === String(b)
}
export default looseEqual