1

我正在尝试为我的 AngularJS 应用程序构建一个辅助函数(但解决方案不必使用angular.forEach)。该函数应采用任意数量的具有相同长度的数组并将这些值相加以形成一个新数组,例如:

a = [1, 2, 3];
b = [4, 5, 6];
result = [5, 7, 9];

我试图不使用 array.map() 或sylvesterjs来实现 IE8 兼容性。我被困在循环参数上,因为 javascript 似乎不喜欢在 for 循环中嵌套函数。到目前为止的代码:

function arrayAdd () {
  // make sure all args have same length
  var totalLen = 0;
  angular.forEach(arguments, function (arg) {
    totalLen += arg.length;
  });
  var avgLen = totalLen / arguments.length;

  if (avgLen === arguments[0].length) {
    var arrNew = mkArray(0, arguments[0].length);
    // helper function to make an empty array, not shown here

    // need to refactor below with loop for unlimited # of args
    angular.forEach(arguments, function (arg, i) {
      arrNew[0] += arg[0];
    });
    angular.forEach(arguments, function (arg, i) {
      arrNew[1] += arg[1];
    });

    return arrNew;
  } else {
    throw 'arrayAdd expects args with equal length';
  }
}

谢谢!

4

3 回答 3

4

不需要地图,您只需要在汇总数组时跟踪它们。

(这不会检查数组是否具有相同的长度-)

  function sumArrayElements(){
        var arrays= arguments, results= [], 
        count= arrays[0].length, L= arrays.length, 
        sum, next= 0, i;
        while(next<count){
            sum= 0, i= 0;
            while(i<L){
                sum+= Number(arrays[i++][next]);
            }
            results[next++]= sum;
        }
        return results;
    }

var a= [1, 2, 3], b= [4, 5, 6], c= [1, 2, 3];
sumArrayElements(a, b, c)
/* returned value:(Array)
6, 9, 12
*/
于 2013-05-01T20:14:02.257 回答
0

想通了,不需要array.map()。在纸上写出数组和循环很有帮助。希望这对其他人有帮助。

function arrayAdd () {
  // ensure all args have same length
  var totalLen = 0;
  angular.forEach(arguments, function (arg) {
    totalLen += arg.length;
  });
  var difLen = arguments[0].length === totalLen / arguments.length;

  if (difLen) {
    var arrNew = mkYrArray(0, arguments[0].length, 0);
    // helper function to make an empty array, not shown here
    angular.forEach(arguments, function (arr, i1) {
      // each loop is an array from arguments
      angular.forEach(arr, function (arrValue, i2) {
        // each loop is a value from array
        arrNew[i2] += arrValue;
      });
    });
    return arrNew;
  } else {
    throw 'arrayAdd expects args w/ equal len';
  }
}
于 2013-05-01T20:15:05.067 回答
0

如果它不存在,为什么不直接将它添加到数组原型中呢?

if (!('map' in Array.prototype)) {
  Array.prototype.map= function(mapper, that /*opt*/) {
    var other= new Array(this.length);
    for (var i= 0, n= this.length; i<n; i++)
        if (i in this)
            other[i]= mapper.call(that, this[i], i, this);
    return other;
  };
}
于 2013-05-01T19:04:36.337 回答