【问题标题】:Flattening the first element of array with nested objects in JavaScript用 JavaScript 中的嵌套对象展平数组的第一个元素
【发布时间】:2022-01-01 10:32:18
【问题描述】:

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

【问题讨论】:

  • 外部数组中只有一个对象吗?

标签: javascript node.js arrays object nested-lists


【解决方案1】:

根据样本数据,每个数组都有一个值。因此使用[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"
}
*/

【讨论】:

    【解决方案2】:

    你可以看看数组和对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-11
      • 2020-06-23
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2020-12-22
      • 2018-04-20
      • 1970-01-01
      相关资源
      最近更新 更多