我有一些类似的循环
for (let i = 0, l = this.documents.length; i < l; ++i) {
if (item.text !== null) {
if (this.documents[i].text === item.text) {
this.documents[i].mandatory = !item.mandatory;
break;
}
} else {
if (this.documents[i].code === item.code) {
this.documents[i].mandatory = !item.mandatory;
break;
}
}
}
我遇到的问题是,我有很多代码气味,如果有人能帮我缩短代码长度并使其可重复使用吗?感谢
我会这样写:
let doc = (item.text !== null)
? this.documents.find(d => d.text === item.text)
: this.documents.find(d => d.code === item.code)
if (doc)
doc.mandatory = !item.mandatory
这个只需要一个if/else
似乎所有这些if/else分支都设置了相同的值。所以你只需要一个if语句。
for (let i = 0, l = this.documents.length; i < l; ++i) {
if (!item.code && this.documents[i].text === item.text || item.code && this.documents[i].code === item.code) {
this.documents[i].mandatory = !item.mandatory;
break;
}
}
也许可读性更强一点,但执行速度慢一点:
for (let i = 0, l = this.documents.length; i < l; ++i) {
var hasItemText = !item.code && this.documents[i].text === item.text;
var hasItemCode = item.code && this.documents[i].code === item.code;
if ( hasItemText || hasItemCode ) {
this.documents[i].mandatory = !item.mandatory;
break;
}
}
因为我们不知道您希望得到什么输出,所以很难帮助您。但也许是这样?
const key = item.text ? "text" : "code";
const documentIndex = this.documents.findIndex((cur) => cur[key] === item[key]);
if(documentIndex > -1) this.documents[documentIndex].mandatory = !item.mandatory;
您可以提前存储密钥。
在循环中,只需要一个if
语句来检查某个值是否匹配。
由于未知的this.documents
可能是一个类似数组的对象,因此这种方法采用给定的循环。任何其他数组方法,如find
,都需要一个数组,如果没有给定,则需要对其进行转换。
const key = item.text !== null ? 'text' : 'code';
for (let i = 0, l = this.documents.length; i < l; ++i) {
if (this.documents[i][key] === item[key]) {
this.documents[i].mandatory = !item.mandatory;
break;
}
}