优化循环JavaScript

时间:2009-12-23 22:50:36

标签: javascript

ai up,看看这个愚蠢的代码。我想传递字符串或数组并返回数据。这段代码确实有效,但很糟糕。您会建议什么作为删除重复并尽可能优化它的最佳方法?谢谢:))

var getData = function (dataFile) {

  var ajaxResponse = [],
      loop,
      i;

  if(dataFile instanceof Array) {
    loop = dataFile.length;
    for(i = 0; i < loop; i++) {
      $.ajax({
        url: dataFile[i],
        type: "post",
        async: false,
        dataType: "json",
        success: function (data) {
          ajaxResponse[i] = data;
        }
      });
    }
  }
  else {
    $.ajax({
      url: dataFile,
      type: "post",
      async: false,
      dataType: "json",
      success: function (data) {
        ajaxResponse = data;
      }
    });
  }
  return ajaxResponse;
}
谢谢大家,我得考虑一下。如果我愿意,我可以将所有参数作为数组传递但是这会在其他地方引起我的问​​题。 Basicaly我需要以与它们相同的方式获得返回值,即单个值或数组。要求的数据完全不同。我可以改变它,但是不得不考虑从长远来看哪种方式会更好。

4 个答案:

答案 0 :(得分:8)

如果我正确理解代码,这应该有效:

if(!(dataFile instanceof Array))
    dataFile = [dataFile];

即,如果它不是数组,则创建一个只包含该项的数组。然后总是做循环,虽然在某些情况下它只有一次迭代。

我应该添加,以便了解您在for循环中对i变量的使用。您应该将声明更改为for(var i...,而不仅仅是for(i...。引入不带var关键字的变量将始终使该变量成为全局。这意味着在另一个函数中,该循环很可能会在完全不同的for循环中更改i的值,并且您将绝对不知道正在发生什么。

答案 1 :(得分:0)

我喜欢David Hedlund解决方案的优雅,我认为从长远来看,只使用数组会让您的生活更轻松。但是,如果这不适合你的想象,尝试这样的事情(并请改变我的愚蠢的功能名称):

var getOneDatum = function (dataFile) {
  var ajaxResponse;
  $.ajax({
    url: dataFile,
    type: "post",
    async: false,
    dataType: "json",
    success: function (data) {
      ajaxResponse = data;
    }
  });
  return ajaxResponse;
}

var singleOrArray = function (fn, input) {
  var output;
  if (input instanceof Array) {
    var loop = input.length;
    output = [];
    for (i = 0; i < loop; i++) {
      output[i] = fn(input[i]);
    }
  } else {
    output = fn(input);
  }
  return output;
}

var getData = function (dataFile) {
  return singleOrArray(getOneDatum, dataFile);
}

这里的好处是这个singleOrArray函数非常通用,因此您可以在任何时候想要处理可能是也可能不是数组的数据时重复使用它。

答案 2 :(得分:0)

好点,Patonza:)

var singleOrArray = function (fn, input) {
  var output;
  if (input instanceof Array) {
    var loop = input.length;
    output = [];
    for (i = 0; i < loop; i++) {
      output[i] = fn(input[i]);
    }
  } else {
    output = fn(input);
  }
  return output;
}

var getData = function (dataFile) {
  return singleOrArray(function (dataFile) {
    var ajaxResponse;
    $.ajax({
      url: dataFile,
      type: "post",
      async: false,
      dataType: "json",
      success: function (data) {
        ajaxResponse = data;
      }
    });
    return ajaxResponse;
  }, dataFile);
}

答案 3 :(得分:0)

如果你有一个非常庞大的数组,你可以使用以下循环语法使其更快一些(小心尽管IMO会让它更难阅读!)

for (var i = dataFile.length; i--;) {
   // Do loop stuff
}

这个稍微快一点的原因是条件检查和减少是在一次操作中完成而不是两次。