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]) }))
Ответы
Ответ 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];
Демо здесь