Один из возможных подходов:
const obj = { a: 1, b: null, c: 2, d: null }
const output = Object.entries (obj)
.reduce ((a, [k, v]) => v !== null ? [...a, [k, v]] : a, [])
console.log(output)
Вот такой же подход с использованием локальной мутации из Array#reduce
-коммулятора, который является более оптимальным.
Поскольку Array#reduce
получает уже выделенный массив с N пустым слотом (где N является общее количество ключей во входном объекте), массив никогда не требует внутренней операции для увеличения своей длины. После того, как записи объекта уменьшены, мы отфильтровываем неопределенные элементы (те, что были null
):
const obj = {
a: 1,
b: null,
c: 2,
d: null
}
const keyCount = Object.keys(obj).length
const output = Object.entries(obj)
.reduce((a, kvp, i) => {
if (kvp[1] !== null) a[i] = kvp
return a
}, Array(keyCount))
.filter(kvp => kvp)
console.log(output)
JSPerf perf test фильтр + карта против уменьшения + фильтр