Как удалить все атрибуты, которые есть undefined
или null
в объекте JavaScript?
(Вопрос похож на этот для массивов)
javascript
Abhijit
источник
источник
Ответы:
Вы можете перебрать объект:
Если вас беспокоит, что удаление этого свойства не запускает цепочку типов объекта, вы также можете:
Несколько замечаний о нуле против неопределенных:
источник
Используя некоторые ES6 / ES2015 :
1) Простой однострочник для удаления элементов в строке без присваивания:
jsbin
2) Этот пример был удален ...
3) Первый пример, написанный как функция:
jsbin
4) Эта функция также использует рекурсию для удаления элементов из вложенных объектов:
jsbin
4b) Это похоже на 4), но вместо непосредственного изменения исходного объекта он возвращает новый объект.
5) Функциональный подход к 4b), основанный на ответе @ MichaelJ.Zoidl с использованием
filter()
иreduce()
. Этот также возвращает новый объект:jsbin
6) То же, что 4), но с ES7 / 2016
Object.entries()
.5b) Еще одна функциональная версия, которая использует рекурсию и возвращает новый объект с ES2019
Object.fromEntries()
:7) То же, что 4), но в простой ES5 :
jsbin
источник
keys
изobject
, такo
иk
очевидны. Но я думаю, это вопрос вкуса.Object.keys(myObj).forEach(function (key) {(myObj[key] == null) && delete myObj[key]});
Object.entries(myObj).reduce((acc, [key, val]) => { if (val) acc[key] = val; return acc; }, {})
Если вы используете lodash или underscore.js, вот простое решение:
Это будет работать только с lodash 4, pre lodash 4 или underscore.js, use
_.pick(obj, _.identity)
;источник
_.omit(obj, _.isUndefined)
лучше._.isUndefined
не пропускает нули, используйте_.omitBy(obj, _.isNil)
для пропуска обоихundefined
иnull
Самый короткий лайнер для ES6 +
Фильтр всего falsy значения (
""
,0
,false
,null
,undefined
)Фильтр
null
иundefined
значения:Фильтр ТОЛЬКО
null
Фильтр ТОЛЬКО
undefined
Рекурсивные решения: фильтры
null
иundefined
Для объектов:
Для объектов и массивов:
источник
v == null
вы будете проверятьundefined
иnull
.cleanEmpty
recursve решение возвращает пустой объект{}
для объектов ДатыЕсли кому-то нужна рекурсивная версия ответа Оуэна (и Эрика), вот он:
источник
hasOwnProperty
используетif(test.hasOwnProperty(i)) { ... }
JSON.stringify удаляет неопределенные ключи.
источник
null
обращатьсяundefined
с функцией замены, для получения дополнительной информации обратитесь к этому ответу: stackoverflow.com/questions/286141/…null
значения. Попробуй:let a = { b: 1, c: 0, d: false, e: null, f: undefined, g: [], h: {} }
а потомconsole.log(removeUndefined(a))
. Вопрос был оundefined
иnull
ценности.Вы, вероятно, ищете
delete
ключевое слово.источник
Простейшее возможное решение Lodash вернуть объект с
null
иundefined
значениями отфильтрованы._.omitBy(obj, _.isNil)
источник
Вы можете использовать комбинацию
JSON.stringify
, его параметр заменителя, иJSON.parse
превратить его обратно в объект. Использование этого метода также означает, что замена выполняется для всех вложенных ключей во вложенных объектах.Пример объекта
Функция заменителя
Очистить объект
Пример CodePen
источник
Использование ramda # pickBy вы удалите все
null
,undefined
иfalse
значения:Как отметил @manroe, для сохранения
false
значений используйтеisNil()
:источник
(v) => !R.isNil(v)
вероятно, лучший выбор для вопроса ОП, учитывая, чтоfalse
или другие ложные значения также будут отклоненыR.identity
Функциональный и неизменный подход, без
.filter
и без создания большего количества объектов, чем необходимоисточник
obj[key] === undefined
наobj[key] === undefined || obj[key] === null
const omitFalsy = obj => Object.keys(obj).reduce((acc, key) => ({ ...acc, ...(obj[key] && { [key]: obj[key] }) }), {});
Вы можете сделать рекурсивное удаление в одной строке, используя аргумент заменителя json.stringify
Использование:
Как упоминалось в комментарии Эммануэля, этот метод работал, только если ваша структура данных содержит только типы данных, которые могут быть переведены в формат JSON (строки, числа, списки и т. Д.).
(Этот ответ был обновлен , чтобы использовать новый оператор Nullish коалесцирующего в зависимости от потребностей поддержки браузера вы можете использовать эту функцию вместо:.
(k,v) => v!=null ? v : undefined
)источник
NaN
вnull
которые не удаляются.Вы можете сделать короче с
!
условиемПомните при использовании: как @semicolor объявляет в комментариях: это также приведет к удалению свойств, если значением является пустая строка, false или ноль
источник
[null, undefined].includes(r[k])
вместо!r[k]
.Короче чистое решение ES6, конвертируйте его в массив, используйте функцию фильтра и конвертируйте его обратно в объект. Также было бы легко сделать функцию ...
Btw. при этом
.length > 0
я проверяю, есть ли пустая строка / массив, поэтому он удалит пустые ключи.JS BIN https://jsbin.com/kugoyinora/edit?js,console
источник
null
иundefined
было бы проще просто использоватьMY_OBJECT[f] != null
. Ваше текущее решение удаляет все, кроме непустых строк / списков и выдает ошибку, когда значенияnull
filter
, будет более читабельным.omit
делает loadash , вам нужно проверить, существует ли obj перед вызовомObject.keys
:const omit = (obj, filter) => obj && Object.keys(obj).filter(key => !filter(obj[key])).reduce((acc,key) => {acc[key] = obj[key]; return acc}, {});
Если вы хотите 4 линии чистого решения ES7:
Или, если вы предпочитаете более читаемую версию:
Это сохранит логические значения и также очистит массивы. Он также сохраняет исходный объект, возвращая очищенную копию.
источник
У меня такой же сценарий в моем проекте, и я достиг этого, используя следующий метод.
Он работает со всеми типами данных, немногие из упомянутых выше не работают с датой и пустыми массивами.
removeEmptyKeysFromObject.js
передать любой объект этой функции removeEmptyKeysFromObject ()
источник
Для глубокого поиска я использовал следующий код, может быть, он будет полезен всем, кто смотрит на этот вопрос (его нельзя использовать для циклических зависимостей):
источник
Если вы не хотите изменять на месте, но возвращаете клон с удаленным значением null / undefined, вы можете использовать функцию сокращения ES6.
источник
Вместо удаления свойства вы также можете создать новый объект с ключами, которые не равны нулю.
источник
Чтобы piggypack на ответ Бена о том , как решить эту проблему с помощью lodash - х
_.pickBy
, вы можете решить эту проблему в библиотеке сестры: Underscore.js «s_.pick
.Смотрите пример JSFiddle
источник
помощник сокращения может сделать трюк (без проверки типа) -
источник
Если кому-то нужно удалить
undefined
значения из объекта с использованием глубокого поиска,lodash
то вот код, который я использую. Это довольно просто изменить, чтобы удалить все пустые значения (null
/undefined
).источник
С Лодашем:
источник
Если вы используете eslint и хотите избежать срабатывания правила no-param-reassign, вы можете использовать Object.assign в сочетании с .reduce и вычисленным именем свойства для довольно элегантного решения ES6:
источник
Вот функциональный способ удаления
nulls
объекта с помощью ES6 без изменения объекта с использованием толькоreduce
:источник
stripNulls
функции он использует ссылку вне области действия функции аккумулятора; и это также смешивает проблемы, фильтруя в функции аккумулятора. 😝 (напримерObject.entries(o).filter(([k,v]) => v !== null).reduce((o, [k, v]) => {o[k] = v; return o;}, {});
) Да, он будет дважды проходить по фильтрованным элементам, но реализованная потеря производительности там незначительна.Вы также можете использовать
...
синтаксис распространения, используяforEach
что-то вроде этого:источник
Очистить объект на месте
Чистая функция
источник
Мы можем использовать JSON.stringify и JSON.parse для удаления пустых атрибутов из объекта.
источник
{} != {}
и[] != []
), но в противном случае подход действителенВот полная рекурсивная функция (изначально основанная на функции @chickens), которая будет:
defaults=[undefined, null, '', NaN]
ИСПОЛЬЗОВАНИЕ:
источник
Если вы предпочитаете чистый / функциональный подход
источник