我希望能夠在JSON.parsereviver 函式中分散條目的值,同時也洗掉原始鍵。回傳一個擴展的值似乎并沒有做到這一點。
這是一個例子:
const json = {a: 'foo', b: {c: 1, d: '2'}}
const stringify = JSON.stringify(json)
const parsed = JSON.parse(stringify, function(k, v) {
if(k === 'b') {
return {...v}
} else {
return v
}
})
document.getElementById("app").innerHTML = `<pre>${JSON.stringify(parsed, null, 2)}</pre>`;
<div id="app"></div>
在上面所需的輸出應該是
{
"a": "foo",
"c": 1,
"d": "2"
}
uj5u.com熱心網友回復:
雖然我不推薦它,因為它不是很直觀,但您可以使用它與替換器中的值Object.assign(this, v)合并。this這會將屬性中的物件合并b到該b屬性出現的物件中,暫時為您提供:
{a: 'foo', b: {c: 1, d: '2'}, c: 1, d: '2'}
然后b在我們回傳undfined該路徑時被洗掉,給出:
{a: 'foo', c: 1, d: '2'}
const json = {a: 'foo', b: {c: 1, d: '2'}};
const stringify = JSON.stringify(json)
const parsed = JSON.parse(stringify, function(k, v) {
if(k === 'b') {
Object.assign(this, v);
} else {
return v;
}
});
document.getElementById("app").innerHTML = `<pre>${JSON.stringify(parsed, null, 2)}</pre>`;
<div id="app"></div>
uj5u.com熱心網友回復:
JSON.parse reviver 僅轉換鍵“b”處的值并將其設定在該鍵上。我會把它想象成一張地圖。您的解決方案應該在 reviver 功能之外。以下是您的代碼的示例:
let { b, ...parsed } = JSON.parse(stringify);
if (b) {
parsed = { ...parsed, ...b };
}
uj5u.com熱心網友回復:
@Geo Mircean 的答案是正確的,但您的評論為問題添加了新資訊。
如果你有一個復雜的結構,我認為沒有更簡單的選擇。想到的第一個是迭代物件,看看是否需要傳播每個欄位。判斷你是否需要傳播的邏輯取決于你,但它會是這樣的:
let parsed = {...jsonObject};
for(let key in jsonObject)
{
if (typeof jsonObject[key] === 'object') // if you want to spread
{
delete parsed[key]; // delete the actual key
Object.assign(parsed, jsonObject[key]); // add fields to object
}
}
請注意,parsed變數將具有我們的結果。首先它獲取整個物件,然后我們遍歷結果,洗掉欄位并傳播欄位值本身。
來自this StackOverflow questionObject.assign并且在IE9中不起作用(但我個人并不關心)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/493351.html
標籤:javascript json
上一篇:洗掉最后一個元素的邊框底部
