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

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

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

Ответы [ 29 ]

4 голосов
/ 09 ноября 2017

У меня такой же сценарий в моем проекте, и он был реализован с использованием следующего метода.

Работает со всеми типами данных, немногие из упомянутых выше не работают с датой и пустыми массивами.

removeEmptyKeysFromObject.js

removeEmptyKeysFromObject(obj) {
   Object.keys(obj).forEach(key => {
  if (Object.prototype.toString.call(obj[key]) === '[object Date]' && (obj[key].toString().length === 0 || obj[key].toString() === 'Invalid Date')) {
    delete obj[key];
  } else if (obj[key] && typeof obj[key] === 'object') {
    this.removeEmptyKeysFromObject(obj[key]);
  } else if (obj[key] == null || obj[key] === '') {
    delete obj[key];
  }

  if (obj[key]
    && typeof obj[key] === 'object'
    && Object.keys(obj[key]).length === 0
    && Object.prototype.toString.call(obj[key]) !== '[object Date]') {
    delete obj[key];
  }
});
  return obj;
}

передать любой объект этой функции removeEmptyKeysFromObject ()

4 голосов
/ 27 сентября 2017

Если вы хотите 4 линии чистого решения ES7:

const clean = e => e instanceof Object ? Object.entries(e).reduce((o, [k, v]) => {
  if (typeof v === 'boolean' || v) o[k] = clean(v);
  return o;
}, e instanceof Array ? [] : {}) : e;

Или, если вы предпочитаете более читаемую версию:

function filterEmpty(obj, [key, val]) {
  if (typeof val === 'boolean' || val) {
    obj[key] = clean(val)
  };

  return obj;
}

function clean(entry) {
  if (entry instanceof Object) {
    const type = entry instanceof Array ? [] : {};
    const entries = Object.entries(entry);

    return entries.reduce(filterEmpty, type);
  }

  return entry;
}

Это сохранит логические значения, а также очистит массивы. Он также сохраняет исходный объект, возвращая очищенную копию.

3 голосов
/ 26 сентября 2018

помощник может сделать свое дело (без проверки типа) -

const cleanObj = Object.entries(objToClean).reduce((acc, [key, value]) => {
      if (value) {
        acc[key] = value;
      }
      return acc;
    }, {});
3 голосов
/ 12 апреля 2016

Чтобы свалить на Ответ Бена о том, как решить эту проблему с помощью _.pickBy Лодаша, вы также можете решить эту проблему в сестринской библиотеке: Underscore.js * _.pick.

var obj = {name: 'John', age: null};

var compacted = _.pick(obj, function(value) {
  return value !== null && value !== undefined;
});

См .: Пример JSFiddle

3 голосов
/ 22 января 2016

Для глубокого поиска я использовал следующий код, может быть, он будет полезен всем, кто смотрит на этот вопрос (его нельзя использовать для циклических зависимостей):

function removeEmptyValues(obj) {
        for (var propName in obj) {
            if (!obj[propName] || obj[propName].length === 0) {
                delete obj[propName];
            } else if (typeof obj[propName] === 'object') {
                removeEmptyValues(obj[propName]);
            }
        }
        return obj;
    }
2 голосов
/ 08 октября 2012

Вы можете сделать короче с ! условием

var r = {a: null, b: undefined, c:1};
for(var k in r)
   if(!r[k]) delete r[k];

Помните при использовании: как @semicolor объявляет в комментариях: Это также приведет к удалению свойств, если значением является пустая строка, false или ноль

2 голосов
/ 13 марта 2017

Если вы не хотите мутировать на месте, но возвращаете клон с удаленным нулем / неопределенным, вы можете использовать функцию уменьшения ES6.

// Helper to remove undefined or null properties from an object
function removeEmpty(obj) {
  // Protect against null/undefined object passed in
  return Object.keys(obj || {}).reduce((x, k) => {
    // Check for null or undefined
    if (obj[k] != null) {
      x[k] = obj[k];
    }
    return x;
  }, {});
}
2 голосов
/ 30 апреля 2016

Если кому-то нужно удалить значения undefined из объекта с глубоким поиском, используя lodash, то вот код, который я использую. Его довольно просто изменить, чтобы удалить все пустые значения (null / undefined).

function omitUndefinedDeep(obj) {
  return _.reduce(obj, function(result, value, key) {
    if (_.isObject(value)) {
      result[key] = omitUndefinedDeep(value);
    }
    else if (!_.isUndefined(value)) {
      result[key] = value;
    }
    return result;
  }, {});
}
2 голосов
/ 17 марта 2017

Вместо удаления свойства вы также можете создать новый объект с ключами, которые не равны нулю.

const removeEmpty = (obj) => {
  return Object.keys(obj).filter(key => obj[key]).reduce(
    (newObj, key) => {
      newObj[key] = obj[key]
      return newObj
    }, {}
  )
}
1 голос
/ 16 октября 2018

Вы также можете использовать ... синтаксис распространения, используя forEach что-то вроде этого:

let obj = { a: 1, b: "b", c: undefined, d: null };
let cleanObj = {};

Object.keys(obj).forEach(val => {
  const newVal = obj[val];
  cleanObj = newVal ? { ...cleanObj, [val]: newVal } : cleanObj;
});

console.info(cleanObj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...