2017-03-09 2 views
1

ich diese beiden Array von Objekten habenRamda.js zwei Array von Objekten kombinieren, die die gleiche Eigenschaft ID teilen

todos: [ 
    { 
     id: 1, 
     name: 'customerReport', 
     label: 'Report send to customer' 
    }, 
    { 
     id: 2, 
     name: 'handover', 
     label: 'Handover (in CRM)' 
    }, 
    ] 

Und:

todosMoreDetails: [ 
      { 
      id: 1, 
      checked: false, 
      link: { 
       type: 'url', 
       content: 'http://something.com' 
      }, 
      notes: [] 
      }, 
      { 
      id: 2, 
      checked: false, 
      link: { 
       type: 'url', 
       content: 'http://something.com' 
      }, 
      notes: [] 
      } 
     ] 

so dass die endgültige Anordnung von Objekten wird eine sein Kombination der beiden, auf der Objekt-ID basiert, unten wie:

FinalTodos: [ 
      { 
      id: 1, 
      checked: false, 
      link: { 
       type: 'url', 
       content: 'http://something.com' 
      }, 
      notes: [], 
      name: 'customerReport', 
      label: 'Report send to customer' 
      }, 
      { 
      id: 2, 
      checked: false, 
      link: { 
       type: 'url', 
       content: 'http://something.com' 
      }, 
      notes: [], 
      name: 'handover', 
      label: 'Handover (in CRM)' 
      } 
     ] 

ich habe versucht, mit mergemergeAll und mergeWithKey aber ich vermisse wahrscheinlich etwas

Antwort

4

Sie können dies erreichen, mit einem Zwischen groupBy:

Verändern die todosMoreDetails Array in ein Objekt von todo Eigenschaft ID eingegeben groupBy mit:

var moreDetailsById = R.groupBy(R.prop('id'), todosMoreDetails); 

moreDetailsById ist ein Objekt, bei dem der Schlüssel id ist und der Wert ein Array von Todos ist. Wenn die ID eindeutig ist, wird dies ein Singleton-Array sein:

{ 
     1: [{ 
     id: 1, 
     checked: false, 
     link: { 
      type: 'url', 
      content: 'http://something.com' 
     }, 
     notes: [] 
     }] 
} 

nun die todos Array umwandeln, indem jeder todo Verschmelzung zu es Details, die Sie aus der gruppierten Ansicht abrufen:

var finalTodos = R.map(todo => R.merge(todo, moreDetailsById[todo.id][0]), todos); 

einer alternativen detaillierteren weg:

function mergeTodo(todo) { 
    var details = moreDetailsById[todo.id][0]; // this is not null safe 
    var finalTodo = R.merge(todo, details); 
    return finalTodo; 
} 

var moreDetailsById = R.groupBy(R.prop('id'), todosMoreDetails); 
var finalTodos = todos.map(mergeTodo); 
+0

Es funktioniert !! Aber ich habe keine Ahnung warum. Kannst du eine kurze Erklärung geben? Das wäre toll – Anonymous

+0

hinzugefügt einige weitere Details zu meinem Vorschlag –

0

Ich denke, Merge wird nur für Arrays verwendet. Suchen Sie nach dem Objekt "erweitern". Vielleicht ist das Speichern der Todo-Details nicht in separaten Objekten die bessere Lösung.

Mit Strich:

var result = []; 
var entry = {}; 
_.each(todos, function(todo) { 
    _.each(todosMoreDetails, function(detail) { 
     if (todo.id == detail.id) { 
      entry = _.extend(todo, detail); 
      result.push(entry); 
     } 
    } 
}); 
return result; 
Verwandte Themen