更改对象的一种属性

时间:2018-08-02 17:00:05

标签: javascript loops object

我需要遍历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;
    }
  }
}

这似乎是解决该问题的一种非常糟糕的方法。有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

您的代码实际上很好,只是未定义对象的键顺序,因此您的代码可能会设置bcd,具体取决于浏览器引擎(不是b,但您永远不知道...),因此您应该自己下订单:

 function changeOne(object) {
   for(var key of ["a", "b", "c", "d"]) {
     if(object[key] !== true) {
       object[key] = true;
       break;
     }
   }
 }

如果您用“较短”的意思表示“更好”:

 const changeOne = obj => ["a", "b", "c", "d"].some(key => (obj[key] !== true) && (obj[key] = true));

答案 1 :(得分:1)

您可以获取对象的条目,并在属性更改后使用Array#every进行短路。

function setToTrue(object) {
    Object.entries(object).every(([k, v]) => v || !(object[k] = true));
    return object;
}

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

console.log(setToTrue(object));
console.log(setToTrue(object));
console.log(setToTrue(object));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

您可以迭代键并修改第一个具有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)添加支票。