最近我读了很多关于代码中的最佳实践,我尝试做的是“避免”重复。你能说出我的新功能吗?
filterManufacturers(event) {
this.filteredManufacturers = [];
for (let i = 0; i < this.manufacturers.length; i++) {
let manufacturer = this.manufacturers[i].name;
if (this.dontKnowHowToNameIt(manufacturer, event)) {
this.filteredManufacturers.push(manufacturer);
}
}
}
filterModels(event) {
this.filteredModels = [];
for (let manufacturerer of this.manufacturers) {
if (manufacturerer.name === this.vehicle.manufacturer) {
for (let model of manufacturerer.models) {
if (this.dontKnowHowToNameIt(model, event)) {
this.filteredModels.push(model);
}
}
}
}
}
dontKnowHowToNameIt(input, event) {
return (input.toLowerCase().indexOf(event.query.toLowerCase()) == 0);
}
主要基于意见的问题,但让我们回答它。
举个例子来说isInFilter
更有意义,因为你通过在函数中使用event.query
来限制你。
另一个建议是查看更具体的javascript字符串和数组方法。你正在使用angular和typescript,所以你可以使用你喜欢的任何东西(大多数时候):
filterManufacturers(event) {
return this.manufacturers.filter(({ name }) => this.isInFilter(name, event.query));
}
filterModels(event) {
return this.manufacturers
.filter(({ name }) => this.isInFilter(name, this.vehicle.manufacturer))
.map(({ models }) => models)
.filter((model) => this.isInFilter(model, event.query))
.reduce((acc, curr) => acc.concat(curr), []);
}
isInFilter(input, query) {
return input.toLowerCase().startsWith(query.toLowerCase());
}
这将简化您的代码,因为更少的嵌套({{}{}}
)发生
您可以添加一个功能,并在每次需要时调用它,减少重复次数。
function toLoop(x, y) {
for (i of y) {
if (i.id === x.id) {
return y.indexOf(i);
}
} return -1;}
你在另一个函数上调用它..
if (toLoop(r, resp[key]) === -1) {
resp[key].push(r);
}