javascript中两个数组的矩阵组合

时间:2013-12-09 19:18:25

标签: javascript arrays angularjs matrix

我有两个数组可以说

var termRateOptionsArr = [{
    "term": 48,
    "rate": 2.99,
    "residualPercent": 0
}, {
    "term": 60,
    "rate": 1.99,
    "residualPercent": 0
}, {
    "term": 72,
    "rate": 0.99,
    "residualPercent": 0
}];

var cashDownOptionsArr = [{
    "cashdown": "2000"
}, {
    "cashdown": "4000"
}, {
    "cashdown": "6000"
}];

我想使用以下代码将这两个数组组合成一个矩阵组合:

var cartesian = function() {

  var combos = _.reduce(arguments, function(a, b) {
    return _.flatten(_.map(a, function(x) {
      return _.map(b, function(y) {
        return x.concat([y]);
      });
    }), true);
  }, [ [] ]);

  return _.flatten(_.map(combos, function(item) {
    return  _.extend(item[0], item[1]);
  }));

};

console.table( cartesian(termRateOptionsArr,cashDownOptionsArr));

Matrix Combination

我遇到问题我只得到最后一项数组值而不是数组中的每一项。我认为这与一些关闭问题有关,但不确定......任何帮助都表示赞赏..

Click here to see the plnkr

2 个答案:

答案 0 :(得分:0)

根据这篇文章:How can I add a key/value pair to a JavaScript object?,我认为你应该可以使用这样的语法:

termRateOptionsArr[i].cashdown = cashDownOptionsArr[i].cashdown;

答案 1 :(得分:0)

其中一个问题是_.extend()会覆盖其第一个参数(“destination”)中的对象。所以:

 return _.flatten(_.map(combos, function(item) {
    return  _.extend(item[0], item[1]);
  }));

使用新合并的对象覆盖源cashDownOptionsArr数组。

一个修复是克隆目标对象,如下所示:

  return _.flatten(_.map(combos, function(item) {
    var clone0 = _.clone(item[0]);
    return  _.extend(clone0, item[1]);
  }));

plunker with underscore solution

然而,由于在没有下划线的情况下执行此操作非常简单且性能更高,我会将这两个矩阵组合起来:

var cartesian = function(a,b) {

  var combos= [];
  var i=0;
  for (var x=0; x<a.length;x++)
     for (var y=0; y<b.length;y++)
     { 
       combos[i]={};
       // Copy properties of a[x]
       for (var indx in a[x]) {
          combos[i][indx] = a[x][indx];
       }
       // Copy properties of b[y]
       for (var indx in b[y]) {
          combos[i][indx] = b[y][indx];
       }
      i++;
     }
   return combos;
};

Updated plunker