2016-07-29 5 views
2

Ich habe Rekursivitätsproblem beim Versuch, ein Objekt zu stringifizieren.JSON.stringify() - wie aktuelle Tiefe in Ersetzer zu kennen ist

Ich frage mich, ob jemand einen Tipp hat zu wissen, was ist die aktuelle Tiefe beim Iterieren durch Schlüssel -> Wert im Ersetzer? Ich möchte eine Referenz durch ihre ID ersetzen, aber nur wenn ich in einer bestimmten Tiefe bin.

Hier ist ein minimalistisches Objekt ein exemple zu geben:

var a = { 
    id: 'idOfA', 
    linkedItems: [] 
}; 

var b = { 
    id: 'idOfB', 
    linkedItems: [] 
}; 

var c = { 
    id: 'idOfC', 
    linkedItems: [] 
}; 

a.linkedItems.push({ 
    from: 0, 
    to: 0, 
    item: b 
}); 
b.linkedItems.push({ 
    from: 0, 
    to: 0, 
    item: a 
}, { 
    from: 0, 
    to: 0, 
    item: c 
}); 
c.linkedItems.push({ 
    from: 0, 
    to: 0, 
    item: a 
}, { 
    from: 0, 
    to: 0, 
    item: b 
}); 

var obj = { 
    things: {}, 
    otherThings: {}, 
    items: [a, b, c] 
}; 

Von obj, ich brauche jede Referenzen in der "linkedItems" Attribut zu ersetzen, durch ihre ID. ich hart, um die einfacheren Weg, es war zuerst zu stringify ... :)

+0

entsprechenden Code schreiben .. schreiben Sie Ihren Versuch –

+0

zeigen Sie Ihre Dateneingabe – RomanPerekhrest

+0

Die „replacer“ wirklich nur ein Filtermechanismus ist, spielt es keine Zählung der Tiefe halten in dem Objekt, das beschriftet wird. – adeneo

Antwort

0

ich endlich einen Weg gefunden. Aber ich bin mir nicht sicher, ob es der optimale Weg ist: s.

hier ist das, was ich hinzugefügt:

Object.defineProperty(Object.prototype, 'map', { 
    value: function (f, ctx) { 
     ctx = ctx || this; 
     var self = this; 
     var result = {}; 
     Object.keys(self).forEach(function (k) { 
      result[k] = f.call(ctx, self[k], k, self); 
     }); 

     return result; 
    } 
}); 

var okayItems = obj.items.map(function (item, index) { 
    item = Object.assign({}, item, { 
     linkedItems: item.linkedItems.map(function (linkedItem) { 
      linkedItem = linkedItem.map(function (value, key) { 
       return (key === 'item') ? value.id : value; 
      }); 

      return linkedItem; 
     }) 
    }); 

    return item; 
}); 
-1

Sie können die toJson Funktion in das Objekt von Ihnen implementieren und behandeln diesen Fall darin, dann, wenn Sie JSON.stringify nennen es aus, dass zurückgegeben werden Objekt.

Difference between toJSON() and JSON.Stringify()

+0

Ich habe das schon probiert :). Das Problem ist, dass es immer die ID zurückgibt, selbst bei Objekten, die in meinem Objekt nicht tief genug sind. –

0

Ich gehe davon aus, was Sie "Referenzen" nennen (a, b & c) sind String.

var a="SA", b="SB", c="SC" ; 
 

 
var obj = { 
 
    things: {}, 
 
    otherThings: {}, 
 
    items: { 
 
    a: { 
 
     _id: 'idOfA', 
 
     linkedItems: [b, c] 
 
    }, 
 
    b: { 
 
     _id: 'idOfB', 
 
     linkedItems: [a] 
 
    }, 
 
    c: { 
 
     _id: 'idOfC', 
 
     linkedItems: [a, b] 
 
    } 
 
    } 
 
} 
 
function getID(attr){ 
 
    var mapping={'SA':'a','SB':'b','SC':'c'}; 
 
    return obj.items[mapping[attr]]._id; 
 
    
 

 
}; 
 

 
Object.keys(obj.items).map((value, index) =>{ 
 
    obj.items[value].linkedItems = obj.items[value].linkedItems.map((e)=>getID(e)); 
 
}); 
 

 
console.log(obj)

+0

Sorry, aber ich sehe keine Möglichkeit, dies an meine Bedürfnisse anzupassen: s. Sie können meinen ersten Beitrag für weitere Details überprüfen :) –