我將一個 XML 資料決議為一個 JS obj,導致所有父標簽變成一個陣列。我嘗試將其展平,但我似乎無法將頭環繞在遞回部分上。
這是嵌套物件的示例:
nestedObj: [
{
foo1:[ "A" ],
foo2: [
{
bar1: [ "B" ],
bar2: [ "C" ]
}
],
foo3: [ "D" ]
.
.
.
}
]
expectedData: {
foo1: "A" ,
foo2:
{
bar1: "B",
bar2: "C"
}
,
foo3: "D"
.
.
.
}
這是我對代碼的嘗試:
function flattenArrToObj(arr) {
for(let key in arr) {
let val = arr[key];
if(Array.isArray(val)) {
arr[key] = val[0];
} else {
flattenArrToObj(val);
}
}
return arr[0];
}
它在 bar1 和 bar2 等內部資料上運行良好,但正如您所看到的,我仍然必須回傳 arr[0] 來完成我首先想要的 - 這與遞回的努力有些矛盾。對此有何想法?
uj5u.com熱心網友回復:
你可以看看陣列和物件。
const
getObject = object => Object.fromEntries(Object
.entries(object)
.map(([k, v]) => [k, fn(v)])
),
fn = value => {
if (Array.isArray(value)) {
return typeof value[0] === 'object'
? Object.assign({}, ...value.map(getObject))
: value.length === 1
? value[0]
: value
}
return getObject(value);
}
source = [{ foo1: ["A"], foo2: [{ bar1: ["B"], bar2: ["C"] }], foo3: ["D"] }],
result = fn(source);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
根據樣本資料,每個陣列都有一個值。因此使用[0]. 下面的代碼結合使用遞回,Object.fromEntries()并Object.entries()遍歷物件。
const nestedObj = [
{
foo1:[ "A" ],
foo2: [
{
bar1: [ "B" ],
bar2: [ "C" ]
}
],
foo3: [ "D" ]
}
];
const arrToObj = val => {
let vals = Array.isArray(val) ? arrToObj(val[0]) : val;
if (typeof vals === 'object') {
return Object.fromEntries( Object.entries( vals ).map(([k, v]) => [k, arrToObj(v)]) );
} else {
return vals;
}
};
const newObj = arrToObj(nestedObj);
console.log( newObj );
/* OUTPUT
{
"foo1": "A",
"foo2": {
"bar1": "B",
"bar2": "C"
},
"foo3": "D"
}
*/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363718.html
標籤:javascript 节点.js 数组 目的 嵌套列表
