Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Null removal keys
(version: 1)
Comparing performance of:
Onyx implementation vs In place deletion vs Shallow only vs Filter based
Created:
7 months ago
by:
Registered User
Jump to the latest result
Script Preparation code:
// Test Data Generator function generateTestObject(depth, breadth, nullPercentage) { if (depth === 0) { return Math.random() < nullPercentage ? null : 'value_' + Math.random(); } const obj = {}; for (let i = 0; i < breadth; i++) { const shouldBeNull = Math.random() < nullPercentage; obj[`key_${i}`] = shouldBeNull ? null : generateTestObject(depth - 1, breadth, nullPercentage); } return obj; } // Test Cases var shallowSparse = generateTestObject(2, 10, 0.3); // 30% nulls, shallow var deepSparse = generateTestObject(5, 5, 0.3); // 30% nulls, deep nesting var shallowDense = generateTestObject(2, 20, 0.5); // 50% nulls, many keys var deepDense = generateTestObject(4, 10, 0.6); // 60% nulls, very nested
Tests:
Onyx implementation
function removeNestedNullValues(value) { if (value === null || value === undefined || typeof value !== 'object') { return value; } if (Array.isArray(value)) { return [...value]; } const result = {}; for (const key in value) { const propertyValue = value[key]; if (propertyValue === null || propertyValue === undefined) { continue; } if (typeof propertyValue === 'object' && !Array.isArray(propertyValue)) { result[key] = removeNestedNullValues(propertyValue); } else { result[key] = propertyValue; } } return result; } removeNestedNullValues(shallowSparse); removeNestedNullValues(deepSparse); removeNestedNullValues(shallowDense); removeNestedNullValues(deepDense);
In place deletion
function removeNullsInPlace(obj) { if (obj === null || obj === undefined || typeof obj !== 'object') { return obj; } if (Array.isArray(obj)) { return obj; } for (const key in obj) { if (obj[key] === null || obj[key] === undefined) { delete obj[key]; } else if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) { removeNullsInPlace(obj[key]); } } return obj; } removeNullsInPlace(shallowSparse); removeNullsInPlace(deepSparse); removeNullsInPlace(shallowDense); removeNullsInPlace(deepDense);
Shallow only
function removeNullsShallow(obj) { if (obj === null || obj === undefined || typeof obj !== 'object' || Array.isArray(obj)) { return obj; } const result = {}; for (const key in obj) { if (obj[key] !== null && obj[key] !== undefined) { result[key] = obj[key]; } } return result; } removeNullsShallow(shallowSparse); removeNullsShallow(deepSparse); removeNullsShallow(shallowDense); removeNullsShallow(deepDense);
Filter based
function removeNullsFunctional(obj) { if (obj === null || obj === undefined || typeof obj !== 'object') { return obj; } if (Array.isArray(obj)) { return [...obj]; } return Object.fromEntries( Object.entries(obj) .filter(([_, v]) => v !== null && v !== undefined) .map(([k, v]) => [k, typeof v === 'object' && !Array.isArray(v) ? removeNullsFunctional(v) : v]) ); } removeNullsFunctional(shallowSparse); removeNullsFunctional(deepSparse); removeNullsFunctional(shallowDense); removeNullsFunctional(deepDense);
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (4)
Previous results
Fork
Test case name
Result
Onyx implementation
In place deletion
Shallow only
Filter based
Fastest:
N/A
Slowest:
N/A
Latest run results:
Run details:
(Test run date:
7 months ago
)
User agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Browser/OS:
Chrome 140 on Mac OS X 10.15.7
View result in a separate tab
Embed
Embed Benchmark Result
Test name
Executions per second
Onyx implementation
19546.4 Ops/sec
In place deletion
13331.0 Ops/sec
Shallow only
877914.9 Ops/sec
Filter based
1506.1 Ops/sec
Related benchmarks:
find half some
Testing the benchmark for delete
Omit performance
Map vs Object (real-world) Performance (better) 2
Object vs Map base op
Map vs Object (real-world) Performance test
Map vs Object with 100 keys
Map vs Object with 100 keys and mutate
Map vs Object with 100 keys and 1/2 delete
Comments
Confirm delete:
Do you really want to delete benchmark?