Удалить пустые атрибуты из объекта в Javascript - PullRequest
167 голосов
/ 13 ноября 2008

Как удалить все атрибуты undefined или null в объекте JavaScript?

(Вопрос похож на этот для массивов)

Ответы [ 29 ]

1 голос
/ 04 августа 2018

Функционально чистый подход с использованием абстрактной функции

В общем, мы хотели бы получить новый объект, который не содержит определенных значений. Usign ES7:

const getObjWithoutVals = (dontReturnValsArr, obj) => (
    Object.entries(obj).reduce(
        (newObj, [key, val]) => {
            if(!dontReturnValsArr.includes(val)) newObj[key]= val 
            return newObj
        }
        , {}
    )
)

Личный случай - удалить пустые значения

Сначала давайте карри нашу функцию, чтобы мы могли использовать ее для этого сценария.

const curriedGetObjWithout = R.curry(getObjWithoutVals)

Теперь давайте создадим новую функцию, исключающую пустые значения

const getObjWithoutEmpty = curriedGetObjWithout(["", null, undefined])
1 голос
/ 30 июля 2018

Вот функциональный способ удалить nulls из Объекта, используя ES6, не изменяя объект, используя только reduce:

const stripNulls = (obj) => {
  return Object.keys(obj).reduce((acc, current) => {
    if (obj[current] !== null) {
      return { ...acc, [current]: obj[current] }
    }
    return acc
  }, {})
}
1 голос
/ 06 июля 2017

Если вы используете eslint и хотите избежать срабатывания правила no-param-reassign, вы можете использовать Object.assign вместе с .reduce и вычисляемым именем свойства для довольно элегантного решения ES6:

const queryParams = { a: 'a', b: 'b', c: 'c', d: undefined, e: null, f: '', g: 0 };
const cleanParams = Object.keys(queryParams) 
  .filter(key => queryParams[key] != null)
  .reduce((acc, key) => Object.assign(acc, { [key]: queryParams[key] }), {});
// { a: 'a', b: 'b', c: 'c', f: '', g: 0 }
0 голосов
/ 27 мая 2019

Функциональный и неизменный подход, без .filter и без создания большего количества объектов, чем необходимо

Object.keys(obj).reduce((acc, key) => (obj[key] === undefined ? acc : {...acc, [key]: obj[key]}), {})
0 голосов
/ 11 мая 2019

Рекурсивно удаляет нулевые, неопределенные, пустые объекты и пустые массивы, возвращая копию (версия ES6)

export function skipEmpties(dirty) {
    let item;
    if (Array.isArray(dirty)) {
        item = dirty.map(x => skipEmpties(x)).filter(value => value !== undefined);
        return item.length ? item : undefined;
    } else if (dirty && typeof dirty === 'object') {
        item = {};
        Object.keys(dirty).forEach(key => {
            const value = skipEmpties(dirty[key]);
            if (value !== undefined) {
                item[key] = value;
            }
        });
        return Object.keys(item).length ? item : undefined;
    } else {
        return dirty === null ? undefined : dirty;
    }
}
0 голосов
/ 15 февраля 2019

Вы можете выполнить рекурсивное удаление в одной строке, используя аргумент заменителя json.stringify

const removeNullValues = obj => (
  JSON.parse(JSON.stringify(obj, (k,v) => v==null?undefined:v))
)

Использование:

removeNullValues({a:{x:1,y:null,z:undefined}}) // Returns {a:{x:1}}
0 голосов
/ 31 января 2019

Если вы не хотите изменять исходный объект (используя некоторые операторы ES6):

const keys = Object.keys(objectWithNulls).filter(key => objectWithNulls[key]);
const pairs = keys.map(key => ({ [key]: objectWithNulls[key] }));

const objectWithoutNulls = pairs.reduce((val, acc) => ({ ...val, ...acc }));

filter(key => objectWithNulls[key]) возвращает все, что является правдивым , поэтому отклонит любые значения, такие как 0 или false, а также undefined или null. Может быть легко изменено на filter(key => objectWithNulls[key] !== undefined) или что-то подобное, если это нежелательное поведение.

0 голосов
/ 18 декабря 2018

Если вы предпочитаете чистый / функциональный подход

const stripUndef = obj => 
  Object.keys(obj)
   .reduce((p, c) => ({ ...p, ...(x[c] === undefined ? { } : { [c]: x[c] })}), {});
0 голосов
/ 08 марта 2017

С Лодашем:

_.omitBy({a: 1, b: null}, (v) => !v)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...