bootstrap-vue
Version:
BootstrapVue, with over 40 plugins and more than 80 custom components, provides one of the most comprehensive implementations of Bootstrap v4 components and grid system for Vue.js. With extensive and automated WAI-ARIA accessibility markup.
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