在嘗試使遞回函式變得更加舒適的同時,我嘗試撰寫一個函式,該函式接受一個點分隔的字串并將其轉換為一個物件。因此,給定以下字串:user.first.name.robert此函式應回傳以下物件:
{
user: {
first: {
name: 'robert'
}
}
}
這是我的嘗試:
function objectifyHelper(array, object) {
if (array.length === 2) {
const [key, value] = array;
object[key] = value;
return object;
} else {
object[array[0]] = objectifyHelper(array.slice(1), object);
return object;
}
}
function objectify(string) {
const tokens = string.split('.');
return objectifyHelper(tokens, {});
}
const str = 'user.first.name.robert';
const result = objectify(str);
這讓我得到以下結果:
result <ref *1> {
name: 'robert',
first: [Circular * 1],
user: [Circular * 1]
}
我究竟做錯了什么?
uj5u.com熱心網友回復:
您在這里只創建一個物件:
return objectifyHelper(tokens, {});
然后每次分配屬性時都會使用它。您需要在遞回時創建一個新物件,而不僅僅是在objectify.
一個更簡單的方法是:
const objectify = string => string
.split('.')
.reduceRight(
(innerObj, prop) => ({ [prop]: innerObj })
);
const str = 'user.first.name.robert';
const result = objectify(str);
console.log(result);
uj5u.com熱心網友回復:
你快到了。但是,如果您的助手接受一個物件但也回傳它,請在遞回呼叫中保持一致
function objectifyHelper(array, object) {
if (array.length === 2) {
const [key, value] = array;
object[key] = value;
return object;
} else {
object[array[0]] = objectifyHelper(array.slice(1), {});
return object;
}
}
function objectify(string) {
const tokens = string.split('.');
return objectifyHelper(tokens, {});
}
const str = 'user.first.name.robert';
const result = objectify(str);
console.log(result)
請注意,這只會改變您的
object[array[0]] = objectifyHelper(array.slice(1), object);
到
object[array[0]] = objectifyHelper(array.slice(1), {});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475247.html
標籤:javascript 递归
