2013-12-09 169 views
0

我有两个数组可以说矩阵组合

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

+0

为什么你需要两个维度?它不是复制相同的信息,在这种情况下,现金减少选项?这是占用内存空间的浪费。在JavaScript中,二维数组只是数组的数组。 – Yogesh

+0

你怎么结合他们?请发布您的代码,而不仅仅是数据。 – Bergi

+0

@Bergi请参阅上面的链接以获取plnkr ... – Ducati007

回答

0

的问题之一是,_.extend()覆盖对象在它的第一个参数(“目的地”)。因此:

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

+0

很高兴知道...非常感谢:)。 – Ducati007