2013-12-09 2 views
0

У меня есть два массива позволяет сказатьМатричные комбинации двух массивов в JavaScript

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

Смежные вопросы