For循环使其成为可重用的javascript



我有一些类似的循环

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;
}
}

最新更新