代码之家  ›  专栏  ›  技术社区  ›  snazzybouche

更改对象的一个属性

  •  -2
  • snazzybouche  · 技术社区  · 6 年前

    我要绕过去 object 把它的一个非- 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 回复  |  直到 6 年前
        1
  •  1
  •   Jonas Wilms    6 年前

    您的代码实际上很好,只是没有定义对象的键顺序,所以您的代码可以设置 b c d 取决于浏览器引擎(很可能不是 但你永远不知道……,所以你应该自己下命令:

     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));
    
        2
  •  1
  •   Nina Scholz    6 年前

    您可以获取对象的条目并使用 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; }
        3
  •  0
  •   Nir Alfasi    6 年前

    您可以迭代键并修改第一个具有 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) .