0

在我的 webapp 的某个时刻,我有以下(大)系列循环:

jQuery.each(GO, function(index, item){  $("#GO_PUBS").append(
"<li><a href=javascript:dopage('"+item+"');>"+GO_desc[index]+"</a></li>");});

jQuery.each(AP, function(index, item){  $("#AP_PUBS").append(
"<li><a href=javascript:dopage('"+item+"');>"+AP_desc[index]+"</a></li>");});

jQuery.each(BV, function(index, item){  $("#BV_PUBS").append(
"<li><a href=javascript:dopage('"+item+"');>"+BV_desc[index]+"</a></li>");});

jQuery.each(FI, function(index, item){  $("#FI_PUBS").append(
"<li><a href=javascript:dopage('"+item+"');>"+FI_desc[index]+"</a></li>");});

循环继续进行,但模式始终相同。

有什么方法可以通过使用某种数组或列表而不是显式编写循环来缩短它?

谢谢

4

3 回答 3

1

DRY(不要重复自己):首先创建一个函数来做到这一点:

   function createLink(a,b,c){
        jQuery.each(a, function(index, item){  $(b).append(
        "<li><a href=javascript:dopage('"+item+"');>"+c[index]+"</a></li>");});
    }

并打电话

createLink(BV,"#BV_PUBS",BV_desc);
于 2013-06-30T20:31:29.653 回答
1
function xxx(a, b, c) {
    jQuery.each(a, function(index, item){
        $(b).append("<li><a href=javascript:dopage('"+item+"');>"+c[index]+"</a></li>");
    });
}

xxx(GO, "#GO_PUBS", GO_desc);
xxx(AP, "#AP_PUBS", AP_desc);
xxx(BV, "#BV_PUBS", BV_desc);
xxx(FI, "#FI_PUBS", FI_desc);
于 2013-06-30T20:31:42.347 回答
0

像这样的东西:

var iterator = function(id, array) {
  var $holder = $("#" + id);
  return function(index, item) {
    $holder.append("<li><a href=javascript:dopage('"+item+"');>"+array[index]+"</a></li>");
  };
};

jQuery.each(GO, iterator('GO_PUBS', GO_desc));
jQuery.each(AP, iterator('AP_PUBS', AP_desc));
jQuery.each(BV, iterator('BV_PUBS', BV_desc));
jQuery.each(FI, iterator('FI_PUBS', FI_desc));

如果您能够GO, AP,..在这样的地图中获取所有数组():

var collection = {'GO': {asc: GO, desc: GO_desc}, ...};

您将能够执行以下操作:

for(var key in collection) {
  if(collection.hasOwnProperty(key)) {
    var arrMap = collection[key];
    jQuery.each(arrMap.asc, iterator(key + '_PUBS', arrMap.desc));
  }
}

更新:

使用 3D 阵列:

var 3dArr = [['GO', GO, GO_desc], ...], 3dArrLen = 3dArr.length, i = 0;
for(i; i < 3dArrLen; i++) {
  var v = 3dArr[i];
  (function(id, arr, arr_desc) {
    jQuery.each(arr, iterator(id + '_PUBS', arr_desc));
  })(v[0], v[1], v[2]);
}
于 2013-06-30T20:32:03.363 回答