shallowObjectArrayEqualityCheck
Shallow equality check for arrays of objects with primitive property values. Compares each object in the array using shallow object comparison.
When to Use
Use when deriving arrays of objects where all properties are primitives:
- ✅ Arrays of objects with primitive values
- ✅ Mapping data to view models
- ✅ Filtering or transforming object arrays
- ❌ Arrays of objects with nested objects (use
createUniformArrayEqualityCheck
) - ❌ Arrays of primitives (use
shallowArrayEqualityCheck
)
Signature
typescript
function shallowObjectArrayEqualityCheck(): (current: ObjectWithImmutables[]) => booleantype ObjectWithImmutables = Record<string, string | number | boolean>
Basic Usage
tsx
import {shallowObjectArrayEqualityCheck } from '@react-facet/core'constequalityCheck =shallowObjectArrayEqualityCheck ()equalityCheck ([{name : 'Alex' }, {name : 'Steve' }])console .log (equalityCheck ([{name : 'Alex' }, {name : 'Steve' }])) // true - same valuesconsole .log (equalityCheck ([{name : 'Alex' }])) // false - different lengthconsole .log (equalityCheck ([{name : 'Alex' }])) // true - same values againconsole .log (equalityCheck ([{name : 'Steve' }])) // false - different object values
Usage with Facets
Mapping to View Models
tsx
import {useFacetMap ,useFacetWrap ,shallowObjectArrayEqualityCheck } from '@react-facet/core'typePlayer = {id : number;name : string;score : number }typePlayerViewModel = {displayName : string;scoreText : string;isWinning : boolean }constPlayerList = () => {constplayersFacet =useFacetWrap <Player []>([{id : 1,name : 'Steve',score : 100 },{id : 2,name : 'Alex',score : 150 },])constviewModelsFacet =useFacetMap ((players ) =>players .map ((p ) => ({displayName :p .name .toUpperCase (),scoreText : `${p .score } pts`,isWinning :p .score > 120,})),[],[playersFacet ],shallowObjectArrayEqualityCheck , // Prevents updates when view models haven't changed)return <div >Player list</div >}
Filtering Object Arrays
tsx
import {useFacetMap ,useFacetWrap ,shallowObjectArrayEqualityCheck } from '@react-facet/core'typeItem = {id : number;name : string;active : boolean }constActiveItems = () => {constitemsFacet =useFacetWrap <Item []>([{id : 1,name : 'Sword',active : true },{id : 2,name : 'Shield',active : false },{id : 3,name : 'Pickaxe',active : true },])constactiveItemsFacet =useFacetMap ((items ) =>items .filter ((item ) =>item .active ),[],[itemsFacet ],shallowObjectArrayEqualityCheck ,)return <div >Active items</div >}
Combining Data from Multiple Facets
tsx
import {useFacetMap ,useFacetWrap ,shallowObjectArrayEqualityCheck } from '@react-facet/core'constEnrichedList = () => {constusersFacet =useFacetWrap ([{id : 1,name : 'Steve' },{id : 2,name : 'Alex' },])constscoresFacet =useFacetWrap <Record <number, number>>({1: 100,2: 150,})constenrichedUsersFacet =useFacetMap ((users ,scores ) =>users .map ((user ) => ({id :user .id ,name :user .name ,score :scores [user .id ] || 0,})),[],[usersFacet ,scoresFacet ],shallowObjectArrayEqualityCheck ,)return <div >Enriched user list</div >}
Nullable Variant
For cases where the entire array might be null
or undefined
, use nullableShallowObjectArrayEqualityCheck
:
tsx
import {nullableShallowObjectArrayEqualityCheck } from '@react-facet/core'constequalityCheck =nullableShallowObjectArrayEqualityCheck ()equalityCheck (null)console .log (equalityCheck (null)) // true - null === null ✅console .log (equalityCheck ([{id : 1,name : 'Steve' },{id : 2,name : 'Alex' },]),) // false - null → array ❌console .log (equalityCheck ([{id : 1,name : 'Steve' },{id : 2,name : 'Alex' },]),) // true - same array values ✅console .log (equalityCheck (undefined )) // false - array → undefined ❌
For arrays with objects that have nullable properties (like Array<{ name: string | null }>
), you don't need the nullable variant. Regular shallowObjectArrayEqualityCheck
handles null
/undefined
property values just fine using strict equality (===
).
How It Works
The equality check:
- Compares array lengths
- Iterates through each element
- For each object, compares all property values using shallow object equality
- Returns
false
if any property in any object differs
tsx
import {shallowObjectArrayEqualityCheck } from '@react-facet/core'constcheck =shallowObjectArrayEqualityCheck ()check ([{id : 1,name : 'Steve' },{id : 2,name : 'Alex' },])// Different array reference, same object valuesconsole .log (check ([{id : 1,name : 'Steve' },{id : 2,name : 'Alex' },]),) // true ✅// One object changedconsole .log (check ([{id : 1,name : 'Steve' },{id : 2,name : 'Alexandra' },]),) // false ❌// Different array lengthconsole .log (check ([{id : 1,name : 'Steve' }])) // false ❌
Important Notes
Only Shallow Object Comparison
This check performs shallow comparison for each object. Nested objects or arrays are compared by reference:
tsx
import {shallowObjectArrayEqualityCheck } from '@react-facet/core'// ❌ Won't work as expected for nested structurestypeNestedData = {id : numbermetadata : {tags : string[] } // Nested object}constcheck =shallowObjectArrayEqualityCheck ()constnested1 = [{id : 1,metadata : {tags : ['a'] } }]constnested2 = [{id : 1,metadata : {tags : ['a'] } }] // Different metadata reference// @ts-expect-error - Type error: objects contain nested structures, not just primitivescheck (nested1 )// @ts-expect-error - Type error: objects contain nested structures, not just primitivesconsole .log (check (nested2 )) // false - metadata objects have different references
Note: TypeScript will catch this mistake - the equality check expects objects with only primitive properties.
For nested structures, use createUniformArrayEqualityCheck
.
Order Matters
Array element order is significant:
tsx
import {shallowObjectArrayEqualityCheck } from '@react-facet/core'constcheck =shallowObjectArrayEqualityCheck ()check ([{id : 1 }, {id : 2 }])// Same objects, different order - NOT equalconsole .log (check ([{id : 2 }, {id : 1 }])) // false ❌
Property Order Doesn't Matter
Within each object, property order is irrelevant:
tsx
import {shallowObjectArrayEqualityCheck } from '@react-facet/core'constcheck =shallowObjectArrayEqualityCheck ()check ([{name : 'Steve',age : 25 }])// Same values, different property order - equalconsole .log (check ([{age : 25,name : 'Steve' }])) // true ✅
Common Patterns
Search Results
tsx
import { useFacetMap, shallowObjectArrayEqualityCheck } from '@react-facet/core'const searchResultsFacet = useFacetMap((items, query) =>items.filter((item) => item.name.toLowerCase().includes(query.toLowerCase())).map((item) => ({id: item.id,displayName: item.name,matchScore: calculateMatchScore(item.name, query),})),[],[itemsFacet, queryFacet],shallowObjectArrayEqualityCheck,)
Sorted Lists
tsx
import { useFacetMap, shallowObjectArrayEqualityCheck } from '@react-facet/core'const sortedPlayersFacet = useFacetMap((players, sortBy) =>[...players].sort((a, b) => a[sortBy] - b[sortBy]).map((p) => ({id: p.id,name: p.name,sortValue: p[sortBy],})),[],[playersFacet, sortByFacet],shallowObjectArrayEqualityCheck,)
Pagination
tsx
import { useFacetMap, shallowObjectArrayEqualityCheck } from '@react-facet/core'const pageItemsFacet = useFacetMap((items, page, pageSize) => {const start = page * pageSizereturn items.slice(start, start + pageSize).map((item, index) => ({id: item.id,name: item.name,position: start + index + 1,}))},[],[itemsFacet, pageFacet, pageSizeFacet],shallowObjectArrayEqualityCheck,)
Performance Considerations
This check is O(n × m) where:
- n = array length
- m = average number of properties per object
For large arrays with many properties:
- Profile before adding equality check
- Consider if the check is necessary
- For very large datasets, consider pagination or virtualization
Good performance:
tsx
// ✅ Reasonable size (< 100 items, < 10 properties each)const viewModelsFacet = useFacetMap((players) =>players.map((p) => ({id: p.id,name: p.name,score: p.score,})),[],[playersFacet],shallowObjectArrayEqualityCheck,)
See Also
- Equality Checks Overview - Guide to all equality checks
shallowObjectEqualityCheck
- For single objectsshallowArrayEqualityCheck
- For arrays of primitivescreateUniformArrayEqualityCheck
- For nested arrays