我想遍歷嵌套物件,我想將所有子鍵存盤為單獨的陣列并將其作為物件回傳(父鍵作為鍵,子鍵作為值)。
let a = {
b: {
f: {
g: "hi",
i: "wow"
},
e: "hello"
},
c: {
j: "ola"
},
d: {
k: ["bonjour","salam"]
}
}
我期待這樣的物件。
{
a:[b,c,d],
b:[f,e],
f:[g,i],
c:[j],
d:[k]
}
我嘗試并在某種程度上得到了結果。
let res = {};
let keyVal;
var isObject1: any = val => {
if (typeof val === 'object' && val)
res[keyVal] = Object.keys(val);
}
function retrieveObj(obj1) {
for (const key in obj1) {
const value1: any = obj1[key];
keyVal = key;
if (isObject1(value1))
retrieveObj(value1)
}
}
res['a'] = Object.keys(a);
retrieveObj(a);
下面是我得到的輸出。
{
a: [ 'b', 'c', 'd' ],
b: [ 'f', 'e' ],
c: [ 'j' ],
d: [ 'k' ]
}
任何人都可以幫助我獲得完整的輸出。提前致謝
uj5u.com熱心網友回復:
你的代碼有一些問題
您
isObject1對某物是否為物件的檢查無法正常作業,因為typeof [1,2,3] == 'object'將回傳true. 您需要額外檢查!Array.isArray(val)您只處理第一級。您需要對嵌套物件進行遞回呼叫。
不確定
compare你的背景關系是什么您不應定義
keyval為全域變數。如果需要將值從一個作用域傳遞到另一個作用域,請使用引數,而不是全域變數。
以下應該作業
let a = {
b: {
f: {
g: "hi",
i: "wow"
},
e: "hello"
},
c: {
j: "ola"
},
d: {
k: ["bonjour","salam"]
}
}
function getAllKeys(p, o, m) {
if (!o || typeof o !== "object" || Array.isArray(o))
return m;
m[p] = Object.keys(o);
for (let k of m[p])
getAllKeys(k, o[k], m)
return m;
}
let m = getAllKeys("a", a, {})
console.log(m)
它是如何作業的
該函式getAllKeys接受作為引數
p要查看的屬性的名稱o要查看的屬性值m所有陣列合并到的結果物件
首先,如果o傳入的which 不是“真實的”,object我們只需回傳,因為我們不需要對陣列或原始型別做任何事情。作為typeof [...]并typeof null回傳'object'我們需要兩個額外的檢查......
接下來我們將當前物件的所有鍵添加o到結果物件的一個??鍵下p(即我們當前正在查看的物件的名稱)
然后我們o遞回地檢查所有的鍵。即,我們將鍵k和值o[k]與結果物件一起m遞回地傳遞到getAllKeys.
finalreturn m只是為了方便起見,因此我們不需要在第一次呼叫getAllKeys. 沒有這個,return m我們需要這樣稱呼它
let m = {};
getAllKeys("a", a, m);
我不知道你對像下面這樣的物件有什么期望
let a = {
b: {
c: {
d: 3
}
},
e: {
c: {
f: 4
}
}
}
當前的方法只會回傳c: ['f']。如果需要c: ['d', 'f'],您將需要以下內容
m[p] = [ ...(m[p] || []), ...Object.keys(o)];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343863.html
標籤:javascript 打字稿
上一篇:是否可以讓多個鍵指向同一個物件?
