我想要一個物件陣列,其中包含來自嵌套物件的所有物件鍵。我撰寫了一個遞回函式來執行此操作,但是在呼叫該函式時,它并沒有按預期通過物件,而是無限地發回索引。
let array = [];
const findKeys = (ob) => {
let id = 0;
let keys = Object.keys(ob);
for (let i = 0; i < keys.length; i ) {
let object = {
id: id,
label: keys[i],
};
array.push(object);
id ;
findKeys(ob[keys[i]]);
}
return array;
};
let newArray = findKeys(data);
console.log(newArray);
示例資料結構:
const data = {a: {
b: {
c: {
foo: 'bar'
}
}
}}
uj5u.com熱心網友回復:
在進行下一次遞回呼叫之前,您需要檢查是否有物件。您還正在重置 id,因此您將重復 id(也許您想要那個?)并且您正在為陣列使用全域,因此它不能被多次使用。
你會想要這樣的東西:
function getKeys(obj) {
const array = [];
let id = 0;
function loop(obj) {
Object.entries(obj).forEach(entry => {
array.push({
id: id,
label: entry[0],
});
if(entry[1] != null && entry[1].constructor.name === "Object") {
loop(entry[1]);
}
});
}
loop(obj);
return array;
}
const obj1 = { a: 1, b: 'bar' };
console.log(getKeys(obj1));
const obj2 = { a: 1, b: { c: 'bar' } };
console.log(getKeys(obj2));
uj5u.com熱心網友回復:
類似的事情
另請參見檢查值是否為物件字面量?
const data = { a: { b: { c: { foo: 'bar' } } }}
const isObject = el => (Object.prototype.toString.call(el) === '[object Object]')
const findKeys = obj =>
{
let arr = []
, id = 0
;
getKeys(obj)
return arr
function getKeys(o)
{
Object.keys(o).forEach(key =>
{
arr.push({ id:id , label:key })
if (isObject(o[key]))
getKeys(o[key])
})
}
}
console.log( findKeys(data) )
.as-console-wrapper {max-height: 100%!important;top:0 }
uj5u.com熱心網友回復:
也許你可能喜歡
var data = {a: {
b: {
c: {
foo: 'bar',
arr: [1,2,3,4]
}
}
}};
function getAllKeys(obj){
var keys = (typeof obj === "object") && (obj !== null) && Object.keys(obj);
return !!keys ? keys.reduce((r,k) => r.concat(getAllKeys(obj[k])),keys)
: [];
};
var res = getAllKeys(data);
console.log(JSON.stringify(res));
uj5u.com熱心網友回復:
這是一個簡單的技術,使用相當通用的、深度優先的、鍵收集遍歷,然后是一個映射來添加索引:
const flattenKeys = (o) =>
Object (o) === o
? Object .entries (o) .flatMap (([k, v]) => [k, ...flattenKeys (v)])
: []
const getKeys = (o) =>
flattenKeys (o) .map ((label, id) => ({label, id}))
const data = {a: {b: {c: {foo: 'bar'}}}}
console .log (getKeys (data))
.as-console-wrapper {max-height: 100% !important; top: 0}
如果你想要一個廣度優先遍歷它不會更難。
鍵收集和索引生成的這種分離使我認為代碼更簡單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/403056.html
標籤:
