为了账号安全,请及时绑定邮箱和手机立即绑定

向对象递归添加新属性失败

向对象递归添加新属性失败

守着一只汪 2021-09-30 17:56:12
在修改函数中的对象时出现意外结果我了解到我必须item passed to the function在更改它并返回它之前克隆它,并且它适用于上述示例,但是当我在我的递归代码代码中尝试它时,它没有t 工作,这是一个示例:如您所见,我打算更新该属性,B如果它存在,如果它不存在,我想创建一个属性 B 然后给它最后一个值,但由于某种原因,这失败了!,当然,如果我之前创建了属性 B手(在递归调用它之前),我可以给它赋值,但我不知道为什么需要这样做或者为什么我当前的代码不起作用!function addB(item) {  let newItem = { ...item };  if (newItem.B) {    newItem.B.value = "I am B";  } else {    newItem.B = {      value: "I am B"    };  }  if (newItem.children) {    newItem.children.forEach(child => {      //if you uncomment the code below, the code works!      //child.B = {};      child = addB(child);    });  }  return newItem;}function App() {  let parent = {    id: 0,    children: [      {        id: 1,        children: [          {            id: 3          },          {            id: 4          }        ]      },      {        id: 2      }    ]  };  parent = addB(parent);  console.log(parent);}  电流输出:预期输出:
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

我认为您可以执行以下操作:


function addB(item) {

  const newItem = { ...item, B: { value: 'I am B' } };


  if (newItem.children) {

    newItem.children = newItem.children.map(addB);

  }

  return newItem;

}

如果你想复制 B 属性(如果它存在的话)并且只设置 B.value 那么你可以这样做:


const newItem = { ...item, B: { ...item.B, value: 'I am B' } };

function addB(item) {

  const newItem = { ...item, B: { ...item.B,value: 'I am B' } };


  if (newItem.children) {

    newItem.children = newItem.children.map(addB);

  }

  return newItem;

}


console.log(

  addB({

    children: [

      {},

      { children: [{}, { B: { other: 2 } }] },

      { B: { something: 1 } },

    ],

  })

);

另一种写法是:


var addB = item => ({

  ...item,

  B: { ...item.B, value: 'I am B' },

  ...(item.children

    ? { children: item.children.map(addB) }

    : undefined),

});


查看完整回答
反对 回复 2021-09-30
  • 1 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信