这是我的输入
{field1: {field2:'123', field3:{field4:'123'}}}
目标是
{field1: {update: {field2:'123', field3: {update: {field4:'123'}}
这是我尝试过的
function updateDictHelper(obj) {
Object.entries(obj).reduce((updateClause = {}, [key, value]) => {
if (typeof value !== 'object') {
return {... updateClause, [key]: value}
} else {
return {... updateClause, [key]: {update: updateDictHelper(value)}}
}
})
}
但是,无论如何我都能让它工作。我对 java/typescript 很陌生,非常感谢任何帮助。
您有两个问题,第一是您的
updateDirectHelper
没有 return
任何东西。虽然此函数内部有 return
,但它实际上嵌套在 reduce
的回调函数 (updateClause, [key, value]) => {
内部,而不是 updateDictHelper
本身。
您的另一个问题是如何提供默认值
acc
。 Reduce 本身支持第二个参数,它将充当 acc
的默认/初始值,如果可以的话,这是始终提供的最佳实践。如果不包含它, .reduce()
本质上会跳过回调的第一次调用,并首先调用回调函数,并将 acc
设置为数组中的第一个值,并将第二个参数设置为数组中的第二个值。大批。如果您的数组只有一个值(例如您的情况),那么该单个值就是从 .reduce()
调用返回的值,并且永远不会调用 .reduce()
的回调函数:
const arrayWithOneElement = [1];
const res = arrayWithOneElement.reduce(() => {
console.log("I never run")
}); // Notice no second argument
console.log(res);
为了避免所有这些,您可以将第二个 argumnet 作为空对象传递,这将是
acc
的起始值:
function updateDictHelper(obj) {
return Object.entries(obj).reduce((updateClause, [key, value]) => {
if (typeof value !== 'object') {
return {... updateClause, [key]: value}
} else {
return {... updateClause, [key]: {update: updateDictHelper(value)}}
}
}, {});
}
console.log(updateDictHelper({field1: {field2:'123', field3:{field4:'123'}}}));