[英]How to remove a property from an object and/or array if the value is null, undefined or empty?
所以我有一個像這樣的相當復雜的對象 :
var obj = {
v1:"ok",
v2:[
{av1:"foo", av2:null}, // notice there's a null here
{av1:"thing", av2:"stuff"}
],
v3: null,
v4:{
ov1:"slim",
ov2:"shady",
ov3:null // null
},
v5:[], // empty
v6:{} // empty
}
我想把這個找回來:
var obj = {
v1:"ok",
v2:[{av1:"foo"},{av1:"thing", av2:"stuff"}],
v4:{ov1:"slim",ov2:"shady"}
}
我正在嘗試編寫一個函數,該函數可以刪除任何為null,未定義或為空的內容,但它很快就成為了意大利面條夢night,並且無法正常工作。
我覺得有一種較短的更優雅的方法可以做到這一點,但這是到目前為止的代碼 :
function deleteNulls(o){
for(let i in o){
if(typeof o[i] == "Object"){
o[i] = deleteNulls(o[i])
}
else if(typeof o[i] == "Array"){
o[i] = deleteNulls(o[i])
}
if(o[i] == null || o[i] == "undefined" || o[i] == [] | o[i] == {})
delete o[i]
else {
if(typeof o == "Object"){
delete this.o[i]
return o
}
else if (typeof o == "Array")
return o.filter(k => o[k] != null)
}
}
return o
}
var obj = deleteNulls(obj)
我對如何解決上面代碼中的錯誤不感興趣。 如果我願意的話,我可以讓它工作,
我想知道是否有更簡單的方法。
我建議使用類似lodash的東西。 經過速度測試和同行評審,以確保速度和效率。
就像是:
var result = _.omitBy(my_object, _.isNil);
這將刪除所有空值,您需要更改第二個參數以刪除空對象和數組。
它幫助我編寫了此解決方案,以將邏輯分為遞歸clean
函數(簡化現有對象結構)和shouldKeep
函數(該函數告訴您是否可以根據鍵值將鍵從對象結構中完全刪除)。
var object = { v1: "ok", v2: [{ av1: "foo", av2: null }, // notice there's a null here { av1: "thing", av2: "stuff" } ], v3: null, v4: { ov1: "slim", ov2: "shady", ov3: null // null }, v5: [], // empty v6: {} // empty } function shouldKeep (o) { if (Array.isArray(o)) { return o.length } else if (typeof o === 'object') { return o && Object.keys(o).length } return o != null } function clean (o) { if (Array.isArray(o)) { o.forEach(clean) var a = o.filter(shouldKeep) o.length = a.length for (var i = 0; i < a.length; i++) { o[i] = a[i] } } else if (o && typeof o === 'object') { Object.keys(o).forEach(function (k) { clean(o[k]) if (!shouldKeep(o[k])) delete o[k] }) } return o } console.log(clean(object))
.as-console-wrapper { min-height: 100vh; }
這是我的看法。 在大多數情況下應該足夠好。
var object = { v1: "ok", v2: [{ av1: "foo", av2: null }, // notice there's a null here { av1: "thing", av2: "stuff" } ], v3: null, v4: { ov1: "slim", ov2: "shady", ov3: null // null }, v5: [], // empty v6: {} // empty } function isEmpty(v) { return v == undefined || v == null || (Array.isArray(v) && v.length === 0) || (typeof v === 'object' && Object.keys(v).length === 0) } function removeFalsyFromObject(v) { var keys = Object.keys(v); keys.forEach(function(k){ var val = v[k]; if (isEmpty(val)) { delete v[k]; } else if (Array.isArray(val)) { removeFalsyFromArray(val); } else if (typeof val === 'object') { removeFalsyFromObject(val); } }) } function removeFalsyFromArray(a) { for (var i=0; i<a.length; i++) { var v = a[i]; if (isEmpty(v)) { a.splice(i,1); i--; } else if (Array.isArray(v)) { removeFalsyFromArray(v); } else if (typeof v === 'object') { removeFalsyFromObject(v); } } } function clean(obj) { removeFalsyFromObject(obj); return obj; } console.log(clean(object));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.