使用reduce操作对象

问题描述 投票:0回答:1

这是我的输入

{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 很陌生,非常感谢任何帮助。

javascript typescript dictionary reduce
1个回答
0
投票

您有两个问题,第一是您的

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'}}}));

© www.soinside.com 2019 - 2024. All rights reserved.