我試圖規范一個嵌套非常深的 JSON,其中包含可以創建 JSON 的所有可能方式。JSON的一部分可以在下面的代碼片段中看到。
我的最終目標是什么
我正在將嵌套的 JSON 轉換為一個簡單的 JS 物件,如下所示
{
key1: value,
key2: value,
...
}
我在以下解決方案中面臨的問題是,當涉及到Objects with values as array
我未能找到查看其關鍵值的方法時。
如果你在代碼
key4,key5 下運行,key6 不會與 console.log 一起顯示,只會列印它的值。
key1 -- values
key2 -- values
key3 -- value3
0 --
0 -- some_value
代碼片段
const req = {
request: {
results: {
key1: 'values',
results: [
{
key2: 'values',
},
],
},
params: {
key3: 'value3',
query: {
key4: [''],
key5: ['123456'],
key6: ['some_value'],
},
},
},
};
function normaliseJSON(obj) {
for (let k in obj) {
if (obj[k] instanceof Object) {
normaliseJSON(obj[k]);
} else {
console.log(`${k} -- ${obj[k]}`);
}
}
}
normaliseJSON(req);
有什么辦法可以得到 key4,5,6 的鑰匙嗎?也對任何其他解決方案開放以規范化此類 JSON
uj5u.com熱心網友回復:
- 您的遞回進入陣列的原因是因為
['123456'] instanceof Object在truejavascript 中(typeof(['asd'])也給出了"object")。要檢查某物是否是陣列,必須檢查Array.isArray(something) - 在模板文字中,當您嘗試嵌入陣列時,例如
...${['123456']}最后它將顯示為...123456沒有括號。因此在陣列的情況下需要JSON.stringify(arr)
可能有更好的方法可以做到這一點,但我創建了一個名為arrayHasObject檢查陣列是否具有物件元素的函式。這是為了捕捉內部results陣列并忽略key4,key5和key6。如果是物件而不是陣列,或者如果是陣列并且它具有物件元素,
則將發生遞回。obj[k]obj[k]
由于遞回很難可視化,我推薦https://pythontutor.com/ 。它主要用于 Python,但也適用于 JS。它可以幫助您可視化這些事情并找出問題所在
當然,如果像key4: [{a:'abc'}]sincearrayHasObject這樣true的東西為此付出了代價,我寫它的方式就會中斷。也許需要相應地更改功能。
function arrayHasObject(arr) {
return arr.some((x) => typeof(x)==='object' && !Array.isArray(x))
}
const req = {
request: {
results: {
key1: 'values',
results: [
{
key2: 'values',
},
],
},
params: {
key3: 'value3',
query: {
key4: [''],
key5: ['123456'],
key6: ['some_value'],
},
},
},
};
function normaliseJSON(obj) {
for (let k in obj) {
if ((obj[k] instanceof Object && !Array.isArray(obj[k])) || (Array.isArray(obj[k]) && arrayHasObject(obj[k]))) {
normaliseJSON(obj[k]);
} else {
if (Array.isArray(obj[k])){
console.log(`${k} -- ${JSON.stringify(obj[k])}`);
}
else{
console.log(`${k} -- ${obj[k]}`);
}
}
}
}
normaliseJSON(req);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/428167.html
標籤:javascript json
上一篇:為什么xmlhttprequest回應在html代碼中
下一篇:子串堆疊拆分-正則運算式
