将嵌套数组转换为对象

时间:2020-09-09 10:57:17

标签: javascript arrays json object arraylist

[["seller" , [["id" , "1"], ["name", "test"]]], ["token", "aasfgsgd"], ["settings", [["general", false], ["store", [["trusted", true], ["socialMedia", [["fbConnected", true], ["igConnected", false]]]]]]]]

此嵌套数组可以是变量,因此将其转换为如下所示的对象

{
    "seller": {
    "id": 1,
    "name": "test"
    },
    "token": "aasfgsgd",
    "settings": {
        "general": false,
        "store": {
            "trusted": true,
            "socialMedia": {
                "fbConnected": true,
                "igConnected": false
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以将Object.fromEntries()与递归函数一起使用,以将所有嵌套的[[key, value], ...]对数组转换为对象本身。

Object.fromEntries()方法可以采用一个数组,例如:

[["key", "val2"]]

...并将其转换为对象:

{
  "key": "val2"
}

但是,如果"val2"本身是数组,则需要先将其转换为对象。这可以通过在数组的值条目上递归调用Object.fromEntries()来完成。

请参见以下示例:

const arr = [["seller" , [["id" , 1], ["name", "test"]]], ["token", "aasfgsgd"], ["settings", [["general", false], ["store", [["trusted", true], ["socialMedia", [["fbConnected", true], ["igConnected", false]]]]]]]];

const makeObject = arr => {
  return Object.fromEntries(arr.map(
    ([key, val]) => Array.isArray(val) ? [key, makeObject(val)] : [key, val] 
  ));
}

console.log(makeObject(arr));

一种对浏览器更友好的方法是将.reduce()spread syntax一起使用,而不是Object.fromEntries()

const arr = [["seller" , [["id" , 1], ["name", "test"]]], ["token", "aasfgsgd"], ["settings", [["general", false], ["store", [["trusted", true], ["socialMedia", [["fbConnected", true], ["igConnected", false]]]]]]]];

const makeObject = arr => {
  return arr.reduce((o, [key, val]) => {
    return Object.assign(o, {[key]: Array.isArray(val) ? makeObject(val) : val});
  }, {});
}

console.log(makeObject(arr));

答案 1 :(得分:0)

const array = [["seller" , [["id" , "1"], ["name", "test"]]], ["token", "aasfgsgd"], ["settings", [["general", false], ["store", [["trusted", true], ["socialMedia", [["fbConnected", true], ["igConnected", false]]]]]]]];

function objectify(arr) {
  return arr.reduce((acc, item) => {
    let builder;
    if (Array.isArray(item[0])) {
      builder = objectify(item[0])
    } else {
      const propName = item[0];
      const propValue = Array.isArray(item[1]) ? objectify(item[1]) : item[1];
      builder = {[propName]: propValue};
    }
    return {
       ...acc,
       ...builder
    }
  }, {});
}

console.log(objectify(array));

相关问题