簡體   English   中英

如果值為空,未定義或為空,如何從對象和/或數組中刪除屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM