簡體   English   中英

使用 setState 跨對象數組更新 object

[英]Update object across array of objects using setState

我的問題與有關,但這里的問題是我必須中繼 object 屬性,我只想更新一個 object。如果我使用map ,它會更新我的對象數組中的所有對象。 它的結構是:

[
    {
      id: 1,
      itemNames: ['aaa','xxx'],
      removed: [],
      ...
    },
    {
      id: 1,
      itemNames: ['yyy', 'xxx'],
      removed: [],
      ...
    },
    ...
]

我的邏輯是:我在 itemNames 中查找項目名稱,如果它存在於 state 中 - 從第一次出現的 object 中刪除它,並將其添加到此 object 的已刪除屬性中。我設法用 map 完成了它,但隨后它對每 object 進行了一次已給出項目名稱。

function filterByItemName(itemName) {
  this.setState(prevState => ({
    ...prevState,
    arr: prevState.arr.map(item) => {
      if (item.itemNames.includes(itemName)) {
        return {
          ...item,
          removed: [...item.removed, itemName],
          itemNames: removeFirstFoundElement(item.itemNames, itemName),
        };
      }
      return item;
    }),
  }));
}

以下代碼的工作方式是找到具有給定 itemName 的所有對象 - 但我只想更改第一種情況......調用filterByItemName('xxx')后我希望它是:

[
    {
      id: 1,
      itemNames: ['aaa'],
      removed: ['xxx],
      ...
    },
    {
      id: 1,
      itemNames: ['yyy', 'xxx'],
      removed: [],
      ...
    },
    ...
]

而現在它是這樣的:

[
    {
      id: 1,
      itemNames: ['aaa'],
      removed: ['xxx],
      ...
    },
    {
      id: 1,
      itemNames: ['yyy'],
      removed: ['xxx'],
      ...
    },
    ...
]

我想你可以設置一個shouldInsert標志來檢查你是否已經插入過一次。 這是我的方法。 如果您可以在此處共享一些codesandbox鏈接,那就更容易了。

function filterByItemName(itemName) {
  let shouldInsert = true;
  this.setState(prevState => ({
    ...prevState,
    arr: prevState.arr.map(item) => {
      const found = item.itemNames.includes(itemName);
      if (found && shouldInsert) {
        shouldInsert = false;
        return {
          ...item,
          removed: [...item.removed, itemName],
          itemNames: removeFirstFoundElement(item.itemNames, itemName),
        };
      }
      return item;
    }),
  }));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM