我正在尝试使用一些for循环将2.5k行函数缩短为更易于管理的东西。经过大量的改动,我成功地扼杀了所有的语法错误。然而,最初非常长但却起作用的功能现在变成了一个更短但功能更强的功能。有人可以解释我做错了什么。
这是我要做的事情的本质:
function countryChange() {
//Blank auto complete box
for(var i=0; i<30; i++){
for(var q=5; q<7; q++){
for(var u=0; u<3; u++){
$("#_Q6_Q".concat(toString(i),"_Q", toString(q), "_Q0_Q", toString(u))).val('');
};
};
$("#_Q6_Q".concat(toString(i),"_Q4_Q0_Q0")).val('');
};
该函数更多,但一切都基本上是重复,使用for循环生成一系列数字,然后将它们放入几个语句中。
没有for循环,_Q6_Q#_Q#_Q0_Q#有30 * 3 * 3个变种,所有变种都必须使用并重复使用几次。
同样值得注意的是,这是使用JQuery AutoComplete小部件: http://api.jqueryui.com/autocomplete/#option-source
我使用Python编写了之前的2.5k行脚本,我对此感到更舒服,可以生成所有大型重复的内容。
现在修复:必须将toString()更改为String()。虽然有些人提到根本不需要这样做。
答案 0 :(得分:1)
我建议你拆分问题,然后创建你稍后会在数组中处理的数字,然后定义什么是crunching函数,然后处理数组:
function createArray () {
var res=[];
var i,q,u;
for(i=0; i<30; i++){
for(q=5; q<7; q++){
for(u=0; u<3; u++) {
res.push([i:i, q:q, u:u]);
};
};
};
}
// just build it once and store it
var myIndexes = createArray();
之后,可以使用一个forEach为所有循环完成处理。
myIndexes.forEach(resetAutoCompleteComboBox);
with:
function resetAutoCompleteComboBox(a) {
var i=toString(a.i);
var q=toString(a.q);
var u=toString(a.u);
$("#_Q6_Q" + i + "_Q" + q + "_Q0_Q" + u)).val('');
}
如果您利用处理函数的相似性,您可能还可以进行其他一些有用的代码分解。
答案 1 :(得分:0)
使用jQuery内置的嘶嘶声选择器可能会更好:
function countryChange() {
$("[id^='_Q6_Q'],[id^='_Q'], [id^='_Q0_Q'], [id^='_Q4_Q0_Q0']").val('');
};
如果您愿意,也可以进行通配符和部分匹配。
以下是选择器参考指南:http://api.jquery.com/category/selectors/