猿问

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

在修改函数中的对象时出现意外结果

我了解到我必须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);

}  

电流输出:

预期输出:

http://img4.mukewang.com/615589df00017d3303650274.jpg

守着一只汪
浏览 205回答 1
1回答

jeck猫

我认为您可以执行以下操作: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),});
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答