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