我正在尝试创建一个将转换如下数组的函数:
[['a', 1], ['b', 2], ['c', [['d', 4]]]]
进入这样的对象:
{ a: 1, b: 2, c: { d: 4 } }
到目前为止,我只是有一个将常规数组转换为常规对象的函数,而我却陷入了递归的困境,我不确定在这种情况下如何实现它。这是我正在使用的功能:
const deepArrayToObject = function(arr) {
let obj = {};
if (arr !== []) {
return obj;
}
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j++) {
let key = arr[i][0];
let value = arr[i][1];
obj[key] = value;
}
}
return obj;
};
我感谢您的反馈。
答案 0 :(得分:2)
诀窍是检查给定属性的value
是否是array
。如果是,请在value
上再次调用该函数,否则按原样使用value
。
这是使用Array.prototype.reduce
的版本。
const a = [['a', 1], ['b', 2], ['c', [['d', 4]]]];
const o = arrayToObject(a);
console.log(o);
function arrayToObject(a) {
return a.reduce((o, [k, v]) => Object.assign(o, {
[k]: Array.isArray(v) ? arrayToObject(v) : v,
}), {});
}
通过Object.assign
函数,您可以将一个或多个对象的属性附加到目标对象上。
在下面的示例中,对象b
的属性将附加到对象a
上,并返回a
。因此a
和c
是同一对象。
const a = { a: 'A' };
const b = { b: 'B' };
const c = Object.assign(a, b);
console.log(a, c, a === c);
三元运算符是简写的if
语句。在函数中,它正在检查v
是否为数组。如果是,则将数组值再次传递给函数,以启动递归调用。
它可以被重写:
if (Array.isArray(v)) {
return arrayToObject(v);
} else {
return v;
}
答案 1 :(得分:1)
您只需要一个循环,对于value
,请检查您是否拥有该循环,如果是数组,则进行递归。
const deepArrayToObject = function(arr) {
let obj = {};
// This does nothing useful
// if (arr !== []) {
// return obj;
// }
for (let i = 0; i < arr.length; i++) {
let key = arr[i][0];
let value = arr[i][1];
if (Array.isArray(value)) {
obj[key] = deepArrayToObject(value);
} else {
obj[key] = value;
}
}
return obj;
};
const a = [['a', 1], ['b', 2], ['c', [['d', 4]]]];
const res = deepArrayToObject(a);
console.log(res);