繁体   English   中英

使用 JavaScript 中的嵌套对象展平数组的第一个元素

[英]Flattening the first element of array with nested objects in JavaScript

我将一个 XML 数据解析成一个 JS obj,导致所有父标签变成一个数组。 我尝试将其展平,但我似乎无法将头绕在递归部分上。

这是嵌套 object 的示例:

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] 才能完成我最初想要的 - 这与递归的努力有些矛盾。 对此有什么想法吗?

你可以看看数组和对象。

 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; }

根据样本数据,每个数组都有一个值。 因此使用[0] 以下代码使用递归组合Object.fromEntries()Object.entries()来遍历 object。

 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" } */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM