2016-03-21 15 views
4

Ich möchte alle Pfade des Objekts aufzulisten, die Blättern führenListe alle möglichen Pfade lodash mit

Beispiel:

var obj = { 
a:"1", 
b:{ 
    foo:"2", 
    bar:3 
}, 
c:[0,1] 
} 

Ergebnis:

"a","b.foo","b.bar", "c[0]","c[1]" 

Ich mag würde einfach finden und lesbare Lösung, am besten mit lodash.

+0

was hast du versucht –

+0

@NaeemShaikh Die einzige Lösung, die mir in den Kopf kommt, ist einfache Rekursion, die durch das Objekt reist. –

+1

ja .. das ist was du machen kannst .. was hast du bisher probiert? Kannst du Code und genaues Problem teilen? –

Antwort

4

Hier ist eine Lösung, die lodash auf so viele Arten verwendet, wie ich denken kann:

function paths(obj, parentKey) { 
    var result; 
    if (_.isArray(obj)) { 
    var idx = 0; 
    result = _.flatMap(obj, function (obj) { 
     return paths(obj, (parentKey || '') + '[' + idx++ + ']'); 
    }); 
    } 
    else if (_.isPlainObject(obj)) { 
    result = _.flatMap(_.keys(obj), function (key) { 
     return _.map(paths(obj[key], key), function (subkey) { 
     return (parentKey ? parentKey + '.' : '') + subkey; 
     }); 
    }); 
    } 
    else { 
    result = []; 
    } 
    return _.concat(result, parentKey || []); 
} 

Edit: Wenn Sie wirklich nur die Blätter wollen, nur result in der letzten Zeile zurück.

+0

Dank @Nick Broderic. Denkst du, es wäre möglich, Rekursion aus deinem Code zu entfernen und statt dessen _.flatMapDeep zu verwenden. –

+2

Ich glaube nicht, dass das funktionieren wird. Der "Deep" -Teil von "flatMapDeep" bezieht sich auf die Abflachung, nicht auf die Kartenoperation. Um dies zu sehen, versuchen Sie '(function() {var _ = require ('lodash'); console.log (_. FlatMapDeep ({a: {b: 1}}, Funktion (v, k) {return k; }))})(); '. Dies wird '['a']' anstelle von '['a', 'b']' ausgeben. –

3

Benutzt überhaupt keine lodash, aber hier ist es mit Rekursion:

var getLeaves = function(tree) { 
    var leaves = []; 
    var walk = function(obj,path){ 
     path = path || ""; 
     for(var n in obj){ 
      if (obj.hasOwnProperty(n)) { 
       if(typeof obj[n] === "object" || obj[n] instanceof Array) { 
        walk(obj[n],path + "." + n); 
       } else { 
        leaves.push(path + "." + n); 
       } 
      } 
     } 
    } 
    walk(tree,"tree"); 
    return leaves; 
} 
+0

@ paweł-adamski beantwortet das deine frage? Wenn ja, bitte überlege, die Antwort zu akzeptieren. Wenn nicht, lass es mich wissen und ich werde weiter helfen. – binarymax

0

Fütterung, die durch diese Funktion Objekt sollte es tun, denke ich.

recursePaths: function(obj){ 
var result = []; 
//get keys for both arrays and objects 
var keys = _.map(obj, function(value, index, collection){ 
    return index; 
}); 


//Iterate over keys 
for (var key in keys) { 
    //Get paths for sub objects 
    if (typeof obj[key] === 'object'){ 
     var paths = allPaths(obj[key]); 
     for (var path in paths){ 
      result.push(key + "." + path); 
     } 
    } else { 
     result.push(key); 
    } 
} 

return result; 
} 
+0

das funktioniert nicht - für das OPs Beispiel Objekt oben bekomme ich ['0', '1', '2'] – binarymax

Verwandte Themen