2013-07-11 3 views
1

У меня есть следующие два массива в JavaScript:Объединить элементы из двух многомерных массивов в JavaScript

"total":[[1370923200000,"66"],[1371009600000,"42"],[1371096000000,"23"]] 

"successful":[[1370923200000,"5"],[1371096000000,"2"],[1371182400000,"0"]] 

Я хотел бы объединить их в один массив/объект, который выглядит примерно так:

{date:1370923200000, total:"66", successful:"5"}, 
{date:1371009600000, total:"42"}, 
{date:1371096000000, total:"23", successful:"2"}, 
{date:1371182400000, successful:"0"} 

Я пробовал несколько разных решений, зацикливаясь на обоих массивах, но я не могу найти элегантное решение.

+2

Показать 'Я пробовал несколько различных решения, пробегает по обеим arrays' части - Вы могли бы быть ближе, чем вы думаете – Ian

+0

Что было последним, что вы уже пробовали? –

+0

Итак, массивы отсортированы каждый раз? – Bergi

ответ

1

Здесь у вас есть:

var total = [[1370923200000, "66"],[1371009600000, "42"],[1371096000000, "23"]]; 
var successful = [[1370923200000, "5"],[1371096000000, "2"],[1371182400000, "0"]]; 
var combined = {}; 

for(var i=0; i<total.length; i++){ 
    combined[total[i][0]] = {date: total[i][0], total: total[i][1]}; 
} 

for(var i=0; i<successful.length; i++){ 
    if(successful[i][0] in combined){ 
     combined[successful[i][0]].successful = successful[i][1]; 
    } 
    else{ 
     combined[successful[i][0]] = { 
      date: successful[i][0], successful: successful[i][1] 
     }; 
    } 
} 

var result = []; 
for(var key in combined){ 
    result.push(combined[key]); 
} 
alert(result.toSource()); 

и рабочий скрипку http://jsfiddle.net/eRjeZ/

+0

Это не гарантирует, что результат будет отсортирован (не уверен, что это требование) – Bergi

+1

Ну, ОП не упоминал об этом. – ElmoVanKielmo

0

Простое решение для п массивов:

var arrays = {"total":[…], "successful":[…]}; 

var result = []; 
for (var prop in arrays) { 
    var arr = arrays[prop]; 
    var i=0; 
    for (var j=0; j<arr.length; j++) { 
     var date = arr[j][0]; 
     while (i < result.length && date > result[i].date) i++; 
     if (i < result.length && date == result[i].date) { 
      result[i][prop] = arr[j][1]; 
     } else { 
      var o = {date:date}; 
      o[prop] = arr[j][1]; 
      result.splice(i, 0, o); 
     } 
    } 
} 

Если вам это нужно быстрее, вы можете использовать Multiple Array Merge Using Binary Heap (см. также Algorithm for N-way merge). Если у вас есть только два списка, взгляните на Most efficient way to merge two arrays of objects.

0
var total = [[1370923200000, "66"],[1371009600000, "42"],[1371096000000, "23"]]; 
var succes = [[1370923200000, "5"],[1371096000000, "2"],[1371182400000, "0"]]; 
var everything = {}; 
var output = []; 

total.map( function(item){ addToEverything(item , "total") }); 
succes.map(function(item){ addToEverything(item , "successful") }); 

console.log(everything); // This looks 'like' what you want, but better 

for(var key in everything) 
    output.push(everything[key]); 

console.log(output); //This looks exactly like what you want 

function addToEverything(item , name) 
{ 
    var key = item[0]; 
    var entry = everything[key] || { date : key }; 
    entry[name] = item[1]; 
    everything[key] = entry; 
} 
Смежные вопросы