2015-03-11 3 views
0

Это такой же основной вопрос структуры данных, что и конкретный вопрос реализации.Как преобразовать две коллекции в один

У меня есть две коллекции:

['One', 'Two', 'Three'] 
[{'Name': 'Two', 'Time': '12:00'}, {'Name': 'Four', 'Time': '14:30'}] 

То, что я хочу, чтобы объединить их в третью коллекцию:

[ 
    {'Name': 'One', 'HasTime': false, 'Valid': true }, 
    {'Name': 'Two', 'HasTime': true, 'Valid': true, 'Time': '12:00' }, 
    {'Name': 'Three', 'HasTime': false, 'Valid': true }, 
    {'Name': 'Four', 'HasTime': true, 'Valid': false, 'Time': '14:30' }, 
] 

я могу это сделать, как в этом псевдокоде:

// Pseudo-Code, hence no isOwnProperty and other checks 
var r = []; 
for(v in one) { 
    var obj = { Name: v, Valid: true, HasTime: false }; 
    for(t in two) { 
    if(t.Name === v) { 
     obj.HasTime = true; 
     obj.Time = t.Time; 
     break; 
    } 
    } 
    r.push(obj); 
} 

for(t in two) { 
    var valid = false; 
    for(x in r) { 
     if(x.Name === t.Name) { 
      valid = true; 
      break; 
     } 
    } 
    if(!valid) { 
     var obj = new { Name: t.name, Valid: false, HasTime: true, Time: t.Time }; 
     r.push(obj); 
    } 
} 
return obj; 

Это кажется неэффективным, и я задаюсь вопросом, может ли Угловая функция уже иметь такую ​​функцию - моя проблема в том, что я не знаю что называется этой техникой. Я предполагаю, что существует термин в теории множеств или функциональном программировании, поскольку это по существу Союз, за ​​которым следует преобразование, но основной термин для этого в функциональном программировании ускользает от меня - есть ли это имя?

ответ

1

Вы могли бы назвать, что карта-свертка, если вы хотите, как вы в основном нужно сначала преобразовать оба массива в единую структуру (Map), а затем сливаются их вместе (Уменьшить).

Однако в этом нет ничего волшебства, тем более, что ваша структура полностью обычна, поэтому вы не можете избежать своего аглоризма.

Вы действительно не нужно карта снижения, так как у вас есть только два массива, но, чтобы дать вам представление о том, что будет выглядеть следующим образом:

var result = [one, two].map(function(arr) { 
    // transform arr into {Name, Valid, HasTime} items 
}).reduce(function(arr1, arr2) { 
    // merge arr1 and arr2 
}); 
Смежные вопросы