【问题标题】:Update one property value of one object in array of objects, return updated array更新对象数组中一个对象的一个​​属性值,返回更新后的数组
【发布时间】:2020-04-06 01:34:15
【问题描述】:

我正在尝试为已删除对象更新一组对象中的一个值 is_deleted

  const handleDelete = (idx) => {
    const filteredCards = cards.map((card, i) => {
      if(i == idx) {
        card.is_deleted = true;
        return {...cards}
      }
    })
   setCards(filteredCards);
  }

输出

cards = [
  undefined,
  [
   { id: 1, is_deleted: false },
   { id: 2, is_deleted: true },
  ]
]

期望的输出

cards = [
 { id: 1, is_deleted: false },
 { id: 2, is_deleted: true },
]

输出部分正确 - 在索引 1 我看到两张卡片,第二张 is_deleted 设置为 true。但是,在索引 0 处有一个“未定义”。

任何关于为什么会这样的见解都会有所帮助!谢谢,如果我错过了关键信息,请告诉我。

【问题讨论】:

  • 你能在函数前显示你的卡片数组吗?
  • 输出的语法不正确

标签: javascript arrays ecmascript-6 javascript-objects array.prototype.map


【解决方案1】:

您可以直接访问该卡,而不是使用map

let cards = [
  { id: 1, is_deleted: false },
  { id: 2, is_deleted: false },
]
const setCards = c => cards = c(cards.slice())

const handleDelete = idx => setCards(cards => (cards[idx].is_deleted = true, cards))

handleDelete(1)
console.log(cards)

setCards 函数只是在模仿 react 的 useState

【讨论】:

  • 你还在改变状态cards[idx].is_deleted = true
  • @ajaiJothi 是的,但这就是为什么 react 允许你提供一个函数来首先访问旧状态。
  • 是的,但您仍在更新引用的值。 cards before updatecards after update 在您的代码中是相等的,因为它们共享相同的引用
  • 部分。 cards[idx].is_deleted = true -> 仍在改变状态。 cards[idx] before and after update 相同
  • 但这就是预期的方式? @ajaiJothi
猜你喜欢
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多