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;i console.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;i console.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=[];