如何更改 Set 中项目的值?

Chr*_*haw 2 javascript set

我有一个我想用 JavaScript 更新的Set,但我想不出任何可以让我更新其中值的东西。

const mySet = new Set([]);
mySet.add('hello');
mySet.add('hewwo');
mySet.add('henlo');
Run Code Online (Sandbox Code Playgroud)

我试过像这样的语法

mySet['hello'] = 'hello world',

mySet.hello = 'hello world', 和

mySet[0] = 'hello world'.

我也试过像这样修改值:

mySet.forEach(item => {
  if (item === 'hello') {
    item = 'hello world';
  }
})
Run Code Online (Sandbox Code Playgroud)

到目前为止,没有什么对我有用。我想在普通数组上使用集合,因为它会自动防止重复项,但我应该自己添加逻辑吗?JavaScript如果我不能修改集合中的值,是否有很好的用例?

Cer*_*nce 5

“修改”(原始)项目的唯一方法是将其从 Set 中删除,然后添加更改的项目。

const mySet = new Set([]);
mySet.add('hello');
mySet.add('hewwo');
mySet.add('henlo');

if (mySet.has('hello')) {
  mySet.delete('hello');
  mySet.add('hello world');
}

console.log(...mySet);
Run Code Online (Sandbox Code Playgroud)

如果您想更改每个项目,请迭代每个项目,再次删除和添加,或者(可能更容易)将其转换为数组并.map转换为新的 Set。

虽然你可以做到这一点,但它仍然是一件很奇怪的事情。将 Set 视为无序集合很有用,它们可以单独添加或删除值。

集合有用的一个重要原因是在其中查找值是一种O(1)操作,与数组不同(查找需要O(n)时间)。

  • `delete` 返回该元素是否存在,因此 `has` 是不必要的:`if (mySel.delete("hello")) mySet.add("hello world")` (2认同)
  • 是的,这是可能的,但阅读 IMO 会很奇怪(很多人看到这一点可能会首先查找“.delete”返回的内容) (2认同)