Javascript 更改对象的一个属性

Javascript 更改对象的一个属性,javascript,loops,object,Javascript,Loops,Object,我需要遍历对象,并将其非true属性中的一个更改为true var object = {a: true, b: false, c: false, d: false} function changeOne(object) { for(var i in object) { if(object[i] !== true) { object[i] = true; break; } } } 这似乎是一种非常糟糕的方式。有更好的方法吗?您可以迭代键并修改第一

我需要遍历
对象
,并将其非
true
属性中的一个更改为
true

var object = {a: true, b: false, c: false, d: false}

function changeOne(object) {
  for(var i in object) {
    if(object[i] !== true) {
      object[i] = true;
      break;
    }
  }
}

这似乎是一种非常糟糕的方式。有更好的方法吗?

您可以迭代键并修改第一个具有
false
值的键:

for (let key of Object.keys(obj)) {
    if (obj[key] !== true) {
        obj[key] = true;
        break;
    }
}
输出

{ a: true, b: true, c: false, d: false }
解释


Object.keys(obj)
将获得在对象本身上定义的属性数组,而
var i in Object
将返回作为原型一部分的其他属性。另一种方法是添加一个检查
obj.hasOwnProperty(key)

您的代码实际上很好,只是没有定义对象的键顺序,因此您的代码可能会根据浏览器引擎设置
b
c
d
(很可能不是
b
,但您永远不知道…),所以你应该自己下订单:

 function changeOne(object) {
   for(var key of ["a", "b", "c", "d"]) {
     if(object[key] !== true) {
       object[key] = true;
       break;
     }
   }
 }
如果你的意思是“更短”的意思是“更好”:


您可以获取对象的条目,并在更改属性后用于短路

函数setToTrue(对象){
Object.entries(Object.every([k,v])=>v | |!(Object[k]=true));
返回对象;
}
var对象={a:true,b:false,c:false,d:false};
log(setToTrue(object));
log(setToTrue(object));
log(setToTrue(object))

.as控制台包装{max height:100%!important;top:0;}
您真的认为
return
会像您预期的那样在这里工作吗?“No”会更有效吗concise@snazzybouche“我不明白你的评论,想解释一下吗?”阿尔法辛问,“有没有更好的办法?”你的答案基本上是我问题中代码的重复——如果你能解释为什么你的答案中的细微差别会使它更好,那将是理想的,但除此之外,它几乎是相同的same@snazzybouche我刚才做了一个可能的复制品:你们的方式很好,不要让别人把你们搞糊涂了。关键的顺序对OP都重要吗?为什么要硬编码对象道具,OP说它们是不可预测的…@dandavus不,OP说他不知道到底哪个道具会改变。是的,钥匙顺序很重要。
 const changeOne = obj => ["a", "b", "c", "d"].some(key => (obj[key] !== true) && (obj[key] = true));