2016-04-21 11 views
1

Ich habe versucht, herauszufinden, wie Rekursion für 2 Objekte, die ähnliche Eigenschaften haben, aber auch Unterschiede haben. Ich brauche diese 2 Objekte in einer einzigartigen Weise zu verschmelzen, so gibt es keine doppelten Länder oder Modelle usw.Rekursion zwischen verschiedenen Objekten und kombiniere sie eindeutig, ohne Duplikat

EDIT: in Vanille js nur bitte

var us1 = { 
 
    country: { 
 
    "United States": { 
 
     "Ford": { 
 
     "engine": { 
 
      type1: "4 cyl", 
 
      type2: "6 cyl" 
 
     } 
 
     }, 
 
     "Chevy": { 
 
     "engine": { 
 
      type1: "6 cyl" 
 
     } 
 
     } 
 
    } 
 
    } 
 
} 
 

 
var us2 = { 
 
    country: { 
 
    "United States": { 
 
     "Ford": { 
 
     "engine": { 
 
      type3: "12 cyl" 
 
     } 
 
     }, 
 
     "Saturn": { 
 
     "engine": { 
 
      type1: "4 cyl" 
 
     } 
 
     } 
 
    } 
 
    } 
 
} 
 

 
var cars = [us1, us2]; 
 
var newCars = []; 
 

 
function fn(cars) { 
 
    if (typeof cars == "object") { 
 
    for (var attr in cars) { 
 
     if (!newCars.hasOwnProperty(cars[attr])) { 
 
     newCars.push(cars[attr]); 
 
     } 
 

 
     fn(cars[attr]) 
 
    } 
 
    } else { 
 
    // 
 
    } 
 
} 
 

 
console.log(fn(cars)); 
 
console.log(newCars)

Ergebnis gesucht: var us1 = { country: { "United States": { "Ford": { "engine": { type1: "4 cyl", type2: "6 cyl", type2: "12 cyl" } }, "Chevy": { "engine": { type1: "6 cyl" } }, "Saturn": { "engine": { type1: "4 cyl" } } } } }

+0

Ich dachte, jede Eigenschaft zu bekommen und weiter bis über – Tatarin

+0

Iterieren müssen Sie Rekursion verwenden? – jessegavin

+0

Nein, ich denke, ich dachte, es wäre das einzige Konzept für dieses Problem – Tatarin

Antwort

1

Wenn Sie eine Bibliothek nicht verwenden wollen, ist es trivial selbst zu schreiben. Etwas nach dem Vorbild von

// (to: Object, ...sources: Object[]) => Object 
function mergeDeep(to) { 
    const sources = Array.from(arguments).slice(1) 

    // (to: Object, from: Object) => void 
    const _merge = (to, from) => { 
    for (let a in from) { 
     if (a in to) { 
     _merge(to[a], from[a]) 
     } else { 
     to[a] = from[a] 
     } 
    } 
    } 

    sources.forEach(from => { 
    _merge(to, from) 
    }) 

    return to 
} 

Siehe Demo hier https://tonicdev.com/bcherny/mergedeep

Aber wirklich, sollten Sie eine Bibliothek für diese verwenden. Das Schreiben selbst ist garantiert buggier und langsamer als jede weit verbreitete existierende Implementierung.

+0

@ jfriend00 Ich bin mir nicht sicher, ob wir den gleichen Code sehen. OP scheint nirgendwo '4 6 cyl' zu haben. – bcherny

-2

Wenn Sie offen sind zu verwenden Underscore.js sollten folgende Arbeiten:

_.extend(us1, us2) 
+0

Macht dies wirklich einzelne Eigenschaften in ein Array zu verschmelzen ihr Inhalt? Irgendwie bezweifle ich es. – jfriend00

+1

'_.extend' führt eine flache Zusammenführung durch - OP bittet um eine tiefe Zusammenführung. – bcherny

+0

War nicht bewusst, dass das OP speziell nach einer tiefen Zusammenführung fragt. Die obige Antwort gibt, was OP wörtlich wollte. – ryan

0

lodash Verwendung:

_.merge(us1, us2) 
+0

gibt es eine Möglichkeit, es nur in Vanille JS zu tun? – Tatarin

+0

technisch funktioniert das in lodash, aber ich möchte nicht hinzufügen lodash nur für diese funktionalität, krank noch +1 für die arbeit antwort – Tatarin

+0

@ jfriend00 es war schuld in meinem namen ich komma trennte sie, ich auch aktualisiert die frage sofort. Tut mir Leid, ich wollte Sie nicht verwirren. Ich brauche dieses obj immer noch tief zusammen, aber nur in Vanille js. Ich weiß es zu schätzen, dass Sie sich mit diesem Thema beschäftigt haben, in der Hoffnung, dass ich noch eine Antwort bekomme. – Tatarin

Verwandte Themen