不可变JS.Set - 根据布尔值添加或删除

ImmutableJS.Set - Add or Remove depending on bool

本文关键字:布尔值 添加 删除 JS Set 不可变      更新时间:2023-09-26

Immutable.Set 是否有一行代码,它会根据布尔值添加()或删除()值?

当然,这可以通过以下方式完成:

if (listShouldHaveFooBool) {
  mySet.add('foo');
}
else {
  mySet.remove('foo');
}

但是有没有像这样的单行代码?(使用虚构的 .modify() 方法)

// mySet = ['foo', 'bar', baz']
// listShouldHaveFooBool = false;
mySet.modify('foo', listShouldHaveFooBool);
// mySet = ['bar', baz']
listShouldHaveFooBool = true;
mySet.modify('foo', listShouldHaveFooBool);
// mySet = ['foo', 'bar', baz']

但是我正在寻找一个单行代码,我可以轻松地将其放入对象文字声明中,例如 React setState:

this.setState({ mySet: mySet.modify(value, shouldHaveValue)});

三级运算符可以工作,但它很丑陋:

this.setState({ mySet: shouldHaveValue ? mySet.add(value) : mySet.remove(value)});

嗯。。。好吧,这还不错...但仍然:是否有一种多合一的不可变方法?

为什么不为它写一个函数呢?

this.setState({ mySet: modify(mySet)(value)(shouldHaveValue) })

然后编写一个单行函数,如下所示:

const modify = set => value => shouldBe => shouldBe === value ? set.add(value) : set.remove(value)

我不确定你为什么使用Sets但如果你使用MapsLists你可以更新它们的值,并可以使用谓词来确定是否创建了值。

ES5

var modify = function(set){
  return function(value){
    return function(shouldBe){
      return shouldBe === value ? set.add(value) : set.remove(value);
    };
  };
};