簡體   English   中英

使用 JSON.parse reviver 在結果對象中強制 undefined 的值,而不是導致屬性被省略

[英]use JSON.parse reviver to force value of undefined in resulting object rather than cause property to be omitted

JSON.parse將序列化的 JSON 作為參數並將其反序列化。 第二個(可選)參數是一個 reviver 函數,它采用鍵和值並返回反序列化對象中的替換值。 記錄的行為是,如果 reviver 返回未定義或不返回任何內容,則相關屬性將從生成的反序列化對象中省略。

我有一種情況,我希望將相關屬性包含在結果反序列化對象中,其值為 undefined。

因此,例如,以下情況目前是正確的:

JSON.parse(JSON.stringify({a: 1, b:2}), (k, v) => v===2 ? undefined : v);
// result of this is {a:1}, as is documented/expected.

但是如果我真的希望結果是

{a:1, b:undefined}

有沒有辦法寫復興者來做到這一點?

我特別不想在反序列化后再次遍歷對象,所以請不要建議將其作為解決方案。 另外我特別不希望將 b 設置為空。 我真的希望它作為值未定義的屬性存在。

這可能根本不可能,但我希望有人有一個好主意!

第一次編輯:

第一個建議是很好的嘗試,但我也需要它在深層結構中工作,所以如下:

JSON.parse(JSON.stringify({
    a: 1,
    b:{
        c: 1,
        d: 2,
        e: [
            1, 
            2,
            {
                f: 1,
                g: 2
            },
            4
        ]
    }
}), (k, v) => v===2 ? undefined : v);

在我的理想世界中應該產生:

{
    a: 1,
    b:{
        c: 1,
        d: undefined,
        e: [
            1, 
            undefined,
            {
                f: 1,
                g: undefined
            },
            4
        ]
    }
}

我懷疑這可以通過簡單的 reviver 和JSON.parse來完成。

我不知道這是否會滿足您的約束,並且它很丑陋,但這是一種方法:將JSON.parse包裝在存儲來自您的 reviver 的undefined鍵並在最后添加它們的東西中。 這並不需要再次迭代您明確拒絕的對象,但它確實迭代了undefined鍵的列表:

 const myParse = (obj, reviver) => { if (typeof reviver !== 'function') { return JSON.parse(obj) } const undefs = [] const rev = (k, v) => { const val = reviver(k, v) if (typeof val === 'undefined') { undefs.push(k) } return val; } const ret = JSON.parse(obj, rev) undefs.forEach(k => ret[k] = undefined) return ret } const result = myParse( JSON.stringify({a: 1, b:2}), (k, v) => v===2 ? undefined : v ) console.log(result)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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