开发者问题收集

如何替换对象数组中的对象?

2023-01-07
78

我正在研究 React.js。 我有一个对象数组 clientList 。 我正在尝试更新创建新客户端的功能,并选择更新 ClientList 中现有的客户端对象并将其替换为用户输入的新数据。 我不知道该怎么做。我尝试在 clientList 上进行映射,并查找用户输入的用户名是否与 ClientList 数组中某个对象中的用户名相似,然后将其替换为 newClient created 。它适用于第一个索引,但对于后续索引,它每次找到相似的用户值时仅复制相同的对象。

这是我的代码:

function App() {
  const [user, setUser] = useState([]);
  const [pwd, setPwd] = useState();
  const [currentClient, setcurrentClient] = useState();
  const [clientList, setClientList] = useState([]);

//function to add and update client

  const addClient = (idNum, user, password, money) => {

    const newClient = new Client(idNum, user, password, money);

    setcurrentClient(newClient);

    setClientList([...clientList, newClient]);

    console.log(currentClient);
    console.log(clientList);

    const result = clientList.map((obj, i) =>
      obj.username === user ? newClient : obj
    );
    console.log(result); 

这是我得到的结果:

(3) [Client, Client, Client]
0: Client {purchaseList: Array(1), id: '123456788', username: 'aaaa a', password: 'Aaaa', moneyAmount: '3'}
1: Client {purchaseList: Array(1), id: '123456788', username: 'aaaa a', password: 'Aaaa', moneyAmount: '3'}
2: Client {purchaseList: Array(1), id: '123456788', username: 'aaaa a', password: 'Aaaa', moneyAmount: '3'}
length: 3

我原本以为,当我尝试更新用户名为“aaaa a”的对象 3 次时,它会仅使用创建的对象更新我的数组。但相反,它使用最后输入的对象值保存了用户名为“aaaa a”的相同对象 3 次。

2个回答

您通过调用 setClientList 将客户端添加到客户端列表中,然后执行一些操作 - 但此时,为时已晚。您需要在设置它之前主动选择是否将其添加到替换列表中。

  const addClient = (idNum, user, password, money) => {

    const newClient = new Client(idNum, user, password, money);

    setcurrentClient(newClient);

    setClientList((prevClientList) => {
       if (prevClientList.some((obj) => obj.id === idNum)) { // This checks if an entry with the same ID already exists
           // If it does, return a map with the matched item replaced
           return prevClientList.map((obj) =>
              obj.id === idNum ? newClient : obj
           );
       }

       
       // If it doesn't add it to the list
       return [...prevClientList, newClient]
    });

顺便说一句,如上所述,在从当前值派生新值时,您应该使用状态设置器的回调形式,以防止在 React 中与陈旧数据相关的错误发生。

此外,最好使用 ID 作为检查对象,因为它通常比用户名更有力。

adsy
2023-01-07

这是我之前说过的另一种方法。您可以使用临时变量并对其进行操作。

const addClient = (idNum, user, password, money) => {
    const newClient = new Client(idNum, user, password, money);
    setcurrentClient(newClient);
    let temp = [...clientList]
    if (temp.some((obj) => obj.idNum === idNum)) {
      temp = temp.map((obj) =>
        obj.idNum === idNum ? newClient : obj
      );
      setClientList(temp)
    }
    else {
      setClientList([...clientList, newClient])
    }
}
boki_bo
2023-01-08