feat: add compactObject snippet (#1670)
Add compactObject snippet Co-authored-by: Anhzf <36941633+Epiclygend@users.noreply.github.com> Co-authored-by: Angelos Chalaris <chalarangelo@gmail.com>
This commit is contained in:
43
snippets/compactObject.md
Normal file
43
snippets/compactObject.md
Normal file
@ -0,0 +1,43 @@
|
||||
---
|
||||
title: compactObject
|
||||
tags: object,array,recursion,advanced
|
||||
---
|
||||
|
||||
Deeply removes all falsy values from an object or array.
|
||||
|
||||
- Use recursion.
|
||||
- Initialize the iterable data, using `Array.isArray()`, `Array.prototype.filter()` and `Boolean` for arrays in order to avoid sparse arrays.
|
||||
- Use `Object.keys()` and `Array.prototype.reduce()` to iterate over each key with an appropriate initial value.
|
||||
- Use `Boolean` to determine the truthiness of each key's value and add it to the accumulator if it's truthy.
|
||||
- Use `typeof` to determine if a given value is an `object` and call the function again to deeply compact it.
|
||||
|
||||
```js
|
||||
const compactObject = val => {
|
||||
const data = Array.isArray(val) ? val.filter(Boolean) : val;
|
||||
return Object.keys(data).reduce(
|
||||
(acc, key) => {
|
||||
const value = data[key];
|
||||
if (Boolean(value))
|
||||
acc[key] = typeof value === 'object' ? compactObject(value) : value;
|
||||
return acc;
|
||||
},
|
||||
Array.isArray(val) ? [] : {}
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
```js
|
||||
const obj = {
|
||||
a: null,
|
||||
b: false,
|
||||
c: true,
|
||||
d: 0,
|
||||
e: 1,
|
||||
f: '',
|
||||
g: 'a',
|
||||
h: [null, false, '', true, 1, 'a'],
|
||||
i: { j: 0, k: false, l: 'a' }
|
||||
};
|
||||
compactObject(obj);
|
||||
// { c: true, e: 1, g: 'a', h: [ true, 1, 'a' ], i: { l: 'a' } }
|
||||
```
|
||||
Reference in New Issue
Block a user