Javascript-将嵌套数组转换为数组的对象

Javascript-将嵌套数组转换为数组的对象,javascript,functional-programming,lodash,Javascript,Functional Programming,Lodash,我有一个形状未知的嵌套数组。以下是一个例子: ["head","val1","val2","val3", ["head2","val4","val5", ["head3","val6","val7", ["head4", "val8"],"val9"]], ["head5", "val10", "val11"] ] 所有阵列的长度均为2或更大。一个数组可以包含任意数量的其他数组,这些数组也可以包含任意数量的数组。所有值都是字符串或数组

我有一个形状未知的嵌套数组。以下是一个例子:

["head","val1","val2","val3",
    ["head2","val4","val5",
        ["head3","val6","val7", 
            ["head4", "val8"],"val9"]],
    ["head5", "val10", "val11"]
]
所有阵列的长度均为2或更大。一个数组可以包含任意数量的其他数组,这些数组也可以包含任意数量的数组。所有值都是字符串或数组

我试图将其转换为具有以下形状的单个对象:

{"head": ["val1","val2","val3", 
    {"head2": ["val4","val5", 
        {"head3": ["val6","val7", 
            {"head4": ["val8"]}, "val9"]},
    {"head5": ["val10", "val11"]}
]}
基本上,每个数组都需要转换为一个对象,其中第一个值是键,数组的其余部分是值。
我尝试过使用
reduce
,但没有完全正确。

在这种情况下,您不知道嵌套数组的深度,因此设计递归函数是一个好主意

在递归函数的基本情况下,输入不是数组,因此只返回输入

在输入为数组的情况下,使用单个属性创建一个JS对象,该属性的名称等于输入数组中的第一个元素,其值等于数组的其余部分。。。您需要对剩余的每个成员递归调用函数,以获得它们在结果数组中的值

var a=[“head”、“val1”、“val2”、“val3”,
[“标题2”、“标题4”、“标题5”,
[“标题3”、“标题6”、“标题7”,
[“第4类”、“第8类”]、“第9类”],
[“标题5”、“标题10”、“标题11”]
];
函数转换(val){
var结果;
if(数组isArray(val)){
var key=val[0];
var val=val.slice(1);
结果={};
结果[键]=[];
对于(变量i=0;iconsole.log(convert(a))在本例中,您不知道嵌套数组的深度,因此设计递归函数是一个好主意

在递归函数的基本情况下,输入不是数组,因此只返回输入

在输入为数组的情况下,使用单个属性创建一个JS对象,该属性的名称等于输入数组中的第一个元素,其值等于数组的其余部分。。。您需要对剩余的每个成员递归调用函数,以获得它们在结果数组中的值

var a=[“head”、“val1”、“val2”、“val3”,
[“标题2”、“标题4”、“标题5”,
[“标题3”、“标题6”、“标题7”,
[“第4类”、“第8类”]、“第9类”],
[“标题5”、“标题10”、“标题11”]
];
函数转换(val){
var结果;
if(数组isArray(val)){
var key=val[0];
var val=val.slice(1);
结果={};
结果[键]=[];
对于(变量i=0;iconsole.log(convert(a))只需像这样递归执行即可:

function convert(arr) {
  return {
    [arr[0]]: arr.slice(1).map(item => Array.isArray(item)? convert(item): item)
  }
}
函数
convert
返回一个包含一个键值对的对象。键是
arr[0]
,值是数组中映射到新数组的其余元素(
arr.slice(1)
),以便对该数组中的所有数组元素调用
convert

ES5版本:

函数转换(arr){
var obj={};
obj[arr[0]]=arr.slice(1).map(函数(项){
返回数组的项目实例?转换(项目):项目;
});
返回obj;

}
像这样递归地做:

function convert(arr) {
  return {
    [arr[0]]: arr.slice(1).map(item => Array.isArray(item)? convert(item): item)
  }
}
函数
convert
返回一个包含一个键值对的对象。键是
arr[0]
,值是数组中映射到新数组的其余元素(
arr.slice(1)
),以便对该数组中的所有数组元素调用
convert

ES5版本:

函数转换(arr){
var obj={};
obj[arr[0]]=arr.slice(1).map(函数(项){
返回数组的项目实例?转换(项目):项目;
});
返回obj;

}
ES6:您可以执行以下操作

function convertArrayToObject(arr) {
  return Array.isArray(arr) && arr.length ? {
    [arr[0]]: arr.slice(1).map(convertArrayToObject)
  } : arr;
}

此代码定义了一个函数convertArrayToObject,如果它不是数组,则返回元素本身;如果它是数组,则将第一个元素设置为键并调用函数,如果它是数组,则将其余元素作为值。

function convertArrayToObject(arr) {
  return Array.isArray(arr) && arr.length ? {
    [arr[0]]: arr.slice(1).map(convertArrayToObject)
  } : arr;
}
此代码定义了一个函数convertArrayToObject,如果它不是数组,则返回元素本身;如果它是数组,则将第一个元素设置为键,并调用函数if,如果它是数组,则将剩余元素作为值。

类似的内容

函数转换(arr){
if(阵列的arr实例){
常量[键,…值]=arr;
返回{[key]:values.map(convert)};
}否则{
返回arr;
}
}
常量测试=[“头”、“值1”、“值2”、“值3”,
[“标题2”、“标题4”、“标题5”,
[“标题3”、“标题6”、“标题7”,
[“第4类”、“第8类”]、“第9类”],
[“标题5”、“标题10”、“标题11”]
];
console.log(转换(测试))

函数转换(arr){
if(阵列的arr实例){
常量[键,…值]=arr;
返回{[key]:values.map(convert)};
}否则{
返回arr;
}
}
常量测试=[“头”、“值1”、“值2”、“值3”,
[“标题2”、“标题4”、“标题5”,
[“标题3”、“标题6”、“标题7”,
[“第4类”、“第8类”]、“第9类”],
[“标题5”、“标题10”、“标题11”]
];

console.log(转换(测试))
此有效方法避免使用
slice()
(这将创建一个大小为N-1的临时数组,该数组将被丢弃):

功能更改(a){
设b=[];
for(设i=1;i));
此有效方法避免使用
slice()
(这将创建一个大小为N-1的临时数组,该数组将被丢弃):

功能更改(a){
设b=[];