2016-06-24 4 views
3

Objekt habe ich folgendes Objekt:Wie eine Funktion zu schreiben, die inlines Eigenschaften

var ob = { 
    view: { 
     name: 'zpo', 
     params: { 
      taskId: 3, 
      zuka: 'v' 
     } 
    } 
} 

Ich brauche dieses Objekt in der folgenden Form haben:

{ 
    "view.name":"zpo", 
    "view.params.taskId":3, 
    "view.params.zuka":"v" 
} 

ich eine Funktion geschrieben haben können, die tun Sie das, aber das Problem ist, dass es externe Variablen erfordert, die an es übergeben werden. Hier ist diese Funktion:

function inline(o, result, container) { 
    for (var p in o) { 
     if (typeof o[p] === "object") { 
      inline(o[p], result.length > 0 ? result+'.'+p : p, container); 
     } else { 
      container[result + '.' + p] = o[p]; 
     } 
    } 
} 

var ob = { 
    view: { 
     name: 'zpo', 
     params: { 
      taskId: 3, 
      zuka: 'v' 
     } 
    } 
} 

var c = {}; 
var r = inline(ob, '', c); 

Gibt es eine Möglichkeit, diese Funktion zu schreiben, korrektes Ergebnis ohne die Notwendigkeit zurückzukehren result und container externe Variablen zu übergeben?

+0

Bevor Sie versuchen, etwas unnötiges zu tun: Warum brauchen Sie es in diesem Format? Warum nicht * einfach * das 'view' Objekt in diesem' ob' benutzen? Wie für Ihr Code-Problem: Nein, tut es nicht, machen Sie einfach die Funktion zurück, setzen Sie das 'container' als erste Funktionszeile' container = {} 'und beenden Sie dann die Funktion auf' return container'. Grundlegendes Rückkehrmuster. –

+0

@ Mike'Pomax'Kamermans. Können Sie bitte ein Beispiel dafür geben, was Sie meinen? –

Antwort

0

Hier ist eine Version, die keine Parameter erfordert.

// Return an array containing the [key, value] couples of an object. 
 
const objEntries = o => Object.keys(o).map(k => [k, o[k]]); 
 

 
// Create an object from an array of [key, value] couples. 
 
const entriesObj = (entries, init={}) => entries.reduce((result, [key, val]) => { 
 
    result[key] = val; 
 
    return result; 
 
}, init); 
 

 
// Reduce on the object entries (as returned by objEntries) with an empty object as 
 
// initialiser. 
 
const inline = (o) => objEntries(o).reduce((result, [key, val]) => { 
 
    if(val instanceof Object){ 
 
    // If the value is an object, recursively inline it. 
 
    const inlineVal = inline(val); 
 
    // Prefix each property names of inlineVal with the key of val and add the 
 
    // properties to the result object. 
 
    entriesObj(
 
     objEntries(inlineVal).map(([subK, subVal]) => [key + '.' + subK, subVal]), 
 
     result 
 
    ); 
 
    } else { 
 
    // If val is not an object, just add it to the result as is. 
 
    result[key] = val; 
 
    } 
 
    // Return the result. 
 
    return result; 
 
}, {}); 
 

 
var ob = { 
 
    view: { 
 
     name: 'zpo', 
 
     params: { 
 
      taskId: 3, 
 
      zuka: 'v' 
 
     } 
 
    } 
 
} 
 

 
var r = inline(ob); 
 
console.log(r);

verwendet I Pfeil Funktionen und Destrukturierung. Alte Browser werden dies nicht unterstützen. Wenn Sie sie unterstützen müssen, ersetzen Sie einfach die Pfeilfunktionen durch normale Funktionen und die Argumente manuell zu destrukturieren.

+0

danke, können Sie bitte einen Blick auf [meine andere Frage] (http://stackoverflow.com/questions/37785593/improve-function-that-converts-serialized -Objekt-in-Punkt-Notation-in-js-Objekt) mit dem damit verbundenen Problem? –

+0

Sorry sein 0:45 in meinem Teil der Welt. Ich gehe jetzt schlafen. Ich werde morgen nachsehen, wenn du bis dahin keine Antwort hast. –

+0

Ich versuche herauszufinden, wie die Funktion funktioniert, die du geschrieben hast. Kannst du bitte etwas über die wichtigsten Ideen erzählen, die du benutzt hast? –

1

Wenn ich Sie richtig verstanden habe, möchten Sie vermeiden, Ihre inline() Funktion mit "leer" params.

Sie könnten diesen Fall in Ihrer Funktion fangen direkt:

function inline(o, result, container) { 
    result = result || ''; 
    container = container || {}; 
    ... 
} 

var r = inline(ob); 

Sie würden noch brauchen dies für den rekursiven Teil Ihrer Funktion params.

+1

dang gleiche Antwort –

0

Javascript ist genial!

function inline(o, result, container) { 
    result = result || ''; 
    container = container || {}; 
    for (var p in o) { 
    if (typeof o[p] === "object") { 
     inline(o[p], result.length > 0 ? result+'.'+p : p, container); 
    } else { 
     container[result + '.' + p] = o[p]; 
    } 
    } 
} 

var r = inline(ob); 
+0

13 Sekunden zu spät, mein Freund: D – lexith

Verwandte Themen