Подтвердить что ты не робот

Javascript - удаление полей undefined из объекта

Есть ли чистый способ удалить поля undefined из объекта?

то есть.

> var obj = { a: 1, b: undefined, c: 3 }
> removeUndefined(obj)
{ a: 1, c: 3 }

Я столкнулся с двумя решениями:

_.each(query, function removeUndefined(value, key) {
  if (_.isUndefined(value)) {
    delete query[key];
  }
});

или

_.omit(obj, _.filter(_.keys(obj), function(key) { return _.isUndefined(obj[key]) }))
4b9b3361

Ответ 1

Однострочник с использованием функции стрелки ESa и троичного оператора:

Object.keys(obj).forEach(key => obj[key] === undefined ? delete obj[key] : '');

Или используйте оценку короткого замыкания вместо троичной: (@Matt Langlois, спасибо за информацию!)

Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key])

jsbin

Тот же пример, использующий выражение if:

Object.keys(obj).forEach(key => {
  if (obj[key] === undefined) {
    delete obj[key];
  }
});

Если вы также хотите удалить элементы из вложенных объектов, вы можете использовать рекурсивную функцию :

const removeEmpty = (obj) => {
  Object.keys(obj).forEach(key => {
    if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key]);
    else if (obj[key] === undefined) delete obj[key];
  });
  return obj;
};

jsbin

Ответ 2

var obj = { a: 1, b: undefined, c: 3 }

Чтобы удалить реквизиты undefined в объекте, мы используем это как

JSON.parse(JSON.stringify(obj));

Вывод: {a: 1, c: 3}

Ответ 3

Я предпочитаю использовать что-то вроде Lodash:

import { pickBy, identity } from 'lodash'

const cleanedObject = pickBy(originalObject, identity)

Обратите внимание, что функция тождества является просто x => x, и ее результат будет ложным для всех ложных значений. Так что это удаляет неопределенные, "", 0, ноль,...

Если вы хотите удалить только значения undefined, вы можете сделать это:

const cleanedObject = pickBy(originalObject, v => v !== undefined)

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

Ответ 4

Это решение также позволяет избежать hasOwnProperty(), поскольку Object.keys возвращает массив заданных объектов, которые можно перечислить.

Object.keys(obj).forEach(function (key) {
 if(typeof obj[key] === 'undefined'){
    delete obj[key];
  }
});

и вы можете добавить это как null или '' для более строгой очистки.

Ответ 5

Поскольку это, кажется, не упоминалось, здесь мой предпочтительный метод, без побочных эффектов или внешних зависимостей:

const obj = {
  a: 1,
  b: undefined
}

const newObject = Object.keys(obj).reduce((acc, key) => {
  const _acc = acc;
  if (obj[key] !== undefined) _acc[key] = obj[key];
  return _acc;
}, {})

console.log(newObject)
// Object {a: 1}

Ответ 6

Это легко запомнить, но может быть медленным. Используйте jQuery для копирования непустых свойств в пустой объект. Нет глубокой копии, если вы не добавите true в качестве первого аргумента.

myObj = $.extend({}, myObj);

Ответ 7

Здесь доступно простое javascript (без библиотеки):

function removeUndefinedProps(obj) {
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && obj[prop] === undefined) {
            delete obj[prop];
        }
    }
}

Рабочая демонстрация: http://jsfiddle.net/jfriend00/djj5g5fu/

Ответ 8

Mhh.. Я думаю, @Damian просит remove undefined field (property) from an JS object. Тогда я просто сделал бы:

for (const i in myObj)  
   if (typeof myObj[i] === 'undefined')   
     delete myObj[i]; 

Короткое и эффективное решение, в (ванили) JS! Пример:

const myObj = {
  a: 1,
  b: undefined,
  c: null, 
  d: 'hello world'
};

for (const i in myObj)  
  if (typeof myObj[i] === 'undefined')   
    delete myObj[i]; 

console.log(myObj);

Ответ 9

Другое решение для Javascript

for(var i=0,keys = Object.keys(obj),len=keys.length;i<len;i++){ 
  if(typeof obj[keys[i]] === 'undefined'){
    delete obj[keys[i]];
  }
}

Никакой дополнительной проверки hasOwnProperty не требуется, поскольку Object.keys не ищет цепочку прототипов и возвращает только свойства obj.

DEMO

Ответ 10

Можно также использовать фильтр JQuery для объектов

var newobj = $(obj).filter(function(key) {
    return $(this)[key]!== undefined;
  })[0];

Демо здесь