Скажем, у меня есть следующий объект JS
data = {
name: "John",
dataOfBirth: "",
externalId: 2548,
email: "[email protected]",
mobile: ""
}
Я получаю такой объект со многими другими свойствами, которые могут быть либо String
, Integer
или undefined
. Для меня, чтобы обновить мою базу данных, я не могу переопределить действительную информацию с пустой.
Я мог бы попробовать, if (data.email === "") delete data.email
со всеми из них, но это кажется непрактичным для поддержки.
Есть ли способ сканировать все свойства, не указывая ни одного из них и удалять все пустые/неопределенные?
Вы можете просто прокручивать ключи объекта и проверять каждый элемент, если они являются пустыми.
var data = {
name: "John",
dataOfBirth: "",
externalId: 2548,
email: "[email protected]",
mobile: ""
}
for(var key in data) {
if(data[key] === "") {
console.log(key + " is blank. Deleting it");
delete data[key]
}
}
Вы не можете это сделать? Или я чего-то не хватает?
Object.entries(data).filter(([k,v],i)=>!!v)
дайте вам следующее:
"[
[
"name",
"John"
],
[
"externalId",
2548
],
[
"email",
"[email protected]"
]
]"
!!
превратит значение в boolean, на этом этапе вы отфильтровываете null, NaN и undefined. В самом деле, если вы хотите попробовать это на вложенных объектах, вам придется рекурсивно делать это, потому что !!Object()
всегда прав. Еще лучше было бы рекурсивно и асинхронно копировать объект, отфильтровывать ложные примитивы и передавать обратный вызов в конце концов.
Редактировать:
Кто-то ниже упомянул некоторые ложные значения, которые вы, возможно, захотите сохранить, например, 0. В этом случае их цепочка:
v===null || v===0 || !!v //null, 0 and anything not falsey, but not undefined etc.