我需要遍历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;
}
}
}
这似乎是解决该问题的一种非常糟糕的方法。有更好的方法吗?
答案 0 :(得分:1)
您的代码实际上很好,只是未定义对象的键顺序,因此您的代码可能会设置b
或c
或d
,具体取决于浏览器引擎(不是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)
添加支票。