2013-12-09 208 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