如何确保对象中的一个 属性 在 javascript 中始终为真

How to ensure that one property in object is always true in javascript

我有一个过滤器对象,如图所示。一次只能有一个过滤器为真,默认 unread 为真。
如果 read 设置为真,则其他两个为假。
如果 read 设置为 false,则默认情况下 unread 应设置为 true。
如何通过调用函数实现此目的 updateFilter(filter,value) 或提出更好的方法。

var filter = {
unread: true,
read: false,
all: false
}

Html部分:

<div class="gb-notification-action-top-switch">
   <div class="gb-notification-action-top-switch-text"> Unread:</div>
   <span class="gb-switch filter-btn"ng-click="healthCtrl.info.noti_filter.unread = !healthCtrl.info.noti_filter.unread;healthCtrl.notificationFilterChange('unread')" ng-class="{'active':  healthCtrl.info.noti_filter.unread }">
      <div class="gb-switch-handle"></div>
   </span>
</div>
<div class="gb-notification-action-top-switch">
   <div class="gb-notification-action-top-switch-text"> Read:</div>
   <span class="gb-switch filter-btn"ng-click="healthCtrl.info.noti_filter.read = healthCtrl.info.noti_filter.read;healthCtrl.notificationFilterChange('read')" ng-class="{'active':  healthCtrl.info.noti_filter.read }">
      <div class="gb-switch-handle"></div>
   </span>
</div>
<div class="gb-notification-action-top-switch">
   <div class="gb-notification-action-top-switch-text"> All:</div>
   <span class="gb-switch filter-btn"ng-click="healthCtrl.info.noti_filter.all = !healthCtrl.info.noti_filter.all;healthCtrl.notificationFilterChange('all')" ng-class="{'active':  healthCtrl.info.noti_filter.all }">
      <div class="gb-switch-handle"></div>
   </span>
</div>

这个函数应该可以解决问题:

function updateFilter(filter, target_filter){
    for (var f of Object.keys(filter)){
        filter[f] = false
    }
    filter[target_filter] = true
}

该函数只是遍历过滤器的所有属性并将它们设置为 false,然后将目标选项设置为 true。

所以,如果你做了类似的事情:

var filter = {
unread: true,
read: false,
all: false
}

updateFilter(filter, "unread")

您的过滤器看起来像:

var filter = {
unread: true,
read: false,
all: false
}

updateFilter(filter, "all") 会让你:

var filter = {
unread: false,
read: false,
all: true
}

依此类推 - 你明白了。

你可以尝试这样做:

const filter = {
    unread: false,
    read: true,
    all: false
}

const updateFilter = (keyName, value) => {
  for (let key in filter) {
    filter[key] = (key === keyName) ? value : false;
  }
  if (!Math.max.apply(null, Object.values(filter))) filter.unread = true;
}
  
updateFilter('read', false);
console.log(filter);