当前位置: 首页 > 知识库问答 >
问题:

更新数组中的对象,在对象中使用preState和useState钩子

蔚元明
2023-03-14

我想根据id等于传递的属性删除嵌套对象。此时,将替换整个对象。当我尝试使用useState更新状态时,我遗漏了一些东西,可能是我循环对象的方式?

更新:问题已关闭,以响应更新嵌套对象的可用答案。这个问题涉及阵列,我认为这是当前问题的一部分。请注意此问题与forEach的性质差异。可能需要使用return语句,或者使用不同的方法对id进行过滤。。

我的初始对象看起来像这样:

{
  "some_id1": [
    {
      "id": 93979,
      // MORE STUFF
   
    },
    {
      "id": 93978,
      // MORE STUFF
    }
  ],
  "some_id2": [
    {
      "id": 93961,
      // MORE STUFF
    },
    {
      "id": 93960,
      // MORE STUFF
    }
  ]
}

我这样浏览每一项:

for (const key in items) {
        if (Object.hasOwnProperty.call(items, key)) {
            const element = items[key];
            element.forEach(x => {
                if (x.id === singleItem.id) {
                    setItems(prevState => ({
                        ...prevState,
                        [key]: {
                            ...prevState[key],
                            [x.id]: undefined
                        }
                    }))
                }
            })
        }

共有3个答案

严心水
2023-03-14
for (const key in items) {
    if (Object.hasOwnProperty.call(items, key)) {
        const element = items[key];
        element.forEach(x => {
            if (x.id === singleItem.id) {
                setItems(prevState => ({
                    ...prevState,
                    //filter will remove the x item
                    [key]: element.filter(i => i.id !== x.id),
                }))
            }
        })
    }
}
for(const k in items) items[k] = items[k].filter(x => x.id !== singleItemId);
const items = {
  "some_id1": [
    {
      "id": 93979,   
    },
    {
      "id": 93978,
    }
  ],
  "some_id2": [
    {
      "id": 93961,
    },
    {
      "id": 93960,
    }
  ]
}

const singleItemId = 93979;
for (const k in items) items[k] = items[k].filter(x => x.id !== singleItemId);

console.log(items);
//setItems(items)
崔琦
2023-03-14

可能一个简单的减少函数会起作用,循环遍历条目并返回一个对象

const data = {"some_id1": [{"id": 93979},{"id": 93978}],"some_id2": [{"id": 93961},{"id": 93960}]}
const remove = ({id, data}) => {
  return Object.entries(data).reduce((prev, [nextKey, nextValue]) => {
    return {...prev, [nextKey]: nextValue.filter(({id: itemId}) => id !==  itemId)}
  
  }, {})

}

console.log(remove({id: 93961, data}))
拓拔弘扬
2023-03-14

您的代码中有3个问题:

  1. 您正在将key的值设置为一个对象,而则需要一个id数组。
// current
[key]: {
 ...prevState[key],
 [x.id]: undefined
}

// expected
[key]: prevState[key].filter(item => item.id === matchingId)
const a = { xyz: 123, xyz: undefined };
console.log(a); // { xyz: undefined} - it did not remove the key

为了使代码更具可读性,需要操作整个对象items,然后使用setItems,将其设置为一次状态,而不是在循环内根据某些条件多次调用setItems

这使您的代码更加可预测,并导致更少的重新渲染。

此外,您的问题的解决方案:

// Define this somewhere
const INITIAL_STATE = {
  "some_id1": [
    {
      "id": 93979
    },
    {
      "id": 93978
    }
  ],
  "some_id2": [
    {
      "id": 93961
    },
    {
      "id": 93960
    }
  ]
};

// State initialization
const [items, setItems] = React.useState(INITIAL_STATE);

// Handler to remove the nested object with matching `id`
const removeByNestedId = (id, items) => {
  const keys = Object.keys(items);
  const updatedItems = keys.reduce((result, key) => {
    const values = items[key];
    // Since, we want to remove the object with matching id, we filter out the ones for which the id did not match. This way, the new values will not include the object with id as `id` argument passed.
    result[key] = values.filter(nestedItem => nestedItem.id !== id)
    return result;
  }, {});
  setItems(updatedItems);
}

// Usage
removeByNestedId(93961, items);
 类似资料:
  • 我真的很喜欢新的React钩子,我经常在我正在做的项目中使用它们。我遇到了一种情况,我想在hook中使用prevState,但我不确定如何做到这一点。 我尝试过类似的东西,但它无法编译。 (顺便说一句,这是映射一组复选框,以跟踪打了复选标记的复选框) 我试图在这里遵循这个例子,但是不使用setState函数。 谢谢你的帮助!

  • 问题内容: 我发现React Hooks文档的这两部分有些令人困惑。使用状态挂钩更新状态对象的最佳实践是哪一种? 想象一下要进行以下状态更新: 选项1 从使用React Hook的文章中,我们可以做到: 所以我可以做: 然后: 选项2 从钩子参考中我们可以得出: 与类组件中的setState方法不同,useState不会自动合并更新对象。您可以通过将函数更新程序形式与对象传播语法结合使用来复制此行

  • 我发现这两个反应钩文档有点混乱。使用状态钩子更新状态对象的最佳实践是哪一个? 假设一个用户希望进行以下状态更新: 选择1 从使用React Hook一文中,我们可以看出这是可能的: 所以我可以做: 然后呢: 选择2 从Hooks参考中我们得到: 与类组件中的setState方法不同,useState不会自动合并更新对象。通过将函数更新程序窗体与对象扩展语法相结合,可以复制此行为: 据我所知,两者都

  • 问题内容: 在带有钩子的React中,更新状态的正确方法是嵌套对象是什么? 一个人怎么会使用到的更新来(附加一个字段)? (改变价值)? 问题答案: 您可以像这样传递新值

  • 我有一系列推车。我想更新请求对象中的产品数量。即。 我有一个数组的产品和数量,比如: 我想更新它们,如: 这可能的逻辑是什么?

  • 我需要创建一个对象(银行),其中包含一组客户端和bankID。我的问题是,我不知道如何在主函数中创建银行。 银行类别: 客户端类: 主要类别: 这些是问题所在: 你必须创建一个程序来模拟银行活动。该系统包括以下模块:银行—客户(客户数组)— idBank(字符串)5 BancAccount — accountNumber(字符串)—金额(浮点)客户—姓名(字符串)—地址(字符串)—账户(银行账户数