@reduxjs/toolkit
Version:
The official, opinionated, batteries-included toolset for efficient Redux development
28 lines (24 loc) • 894 B
text/typescript
import { isPlainObject as _iPO } from '@reduxjs/toolkit'
// remove type guard
const isPlainObject: (_: any) => boolean = _iPO
export function copyWithStructuralSharing<T>(oldObj: any, newObj: T): T
export function copyWithStructuralSharing(oldObj: any, newObj: any): any {
if (
oldObj === newObj ||
!(
(isPlainObject(oldObj) && isPlainObject(newObj)) ||
(Array.isArray(oldObj) && Array.isArray(newObj))
)
) {
return newObj
}
const newKeys = Object.keys(newObj)
const oldKeys = Object.keys(oldObj)
let isSameObject = newKeys.length === oldKeys.length
const mergeObj: any = Array.isArray(newObj) ? [] : {}
for (const key of newKeys) {
mergeObj[key] = copyWithStructuralSharing(oldObj[key], newObj[key])
if (isSameObject) isSameObject = oldObj[key] === mergeObj[key]
}
return isSameObject ? oldObj : mergeObj
}