【问题标题】:Change one property of object改变对象的一个​​属性
【发布时间】:2018-08-02 17:00:05
【问题描述】:

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

这似乎是一个非常糟糕的方法。有没有更好的办法?

【问题讨论】:

标签: javascript loops object


【解决方案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));

【讨论】:

  • 关键顺序对 OP 有影响吗?为什么硬编码对象道具,OP 说它们是不可预测的......
  • @dandavus 不,OP 说他不知道究竟哪个 proerty 会发生变化。是的,keyorder 很重要。
【解决方案2】:

您可以获取对象的条目并在更改属性后使用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】:

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

    【讨论】:

    • 你真的认为return 会像你期望的那样在这里工作吗?
    • “否”会更简洁
    • @snazzybouche 我不明白你的评论,需要解释一下吗?
    • @alfasin 我问“有没有更好的方法来做到这一点”,你的回答基本上是我问题中代码的重复 - 如果你能解释为什么你的细微差别会使它变得更好,这将是理想的,但除此之外它几乎是一样的
    • @snazzybouche 我刚刚做了
    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2016-02-18
    • 2013-12-09
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多