2016-07-29 51 views
2

當嘗試對對象進行串處理時,存在遞歸問題。JSON.stringify() - 如何知道替換器中的當前深度

我想知道是否有人知道什麼是當迭代槽鍵 - >替換器中的值時的當前深度? 我想用它的ID替換引用,但只有當我處於特定深度時。

這裏是一個最低限度的目標,得到爲例:

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] 
}; 

從obj獲得的,我需要在「linkedItems」屬性來替換每個引用,通過其ID。 我強硬的更簡單的方法是首先它字符串化... :)

+0

編寫相關代碼..寫你嘗試 –

+0

顯示輸入數據 – RomanPerekhrest

+0

的「替代品」其實只是一個過濾機制,它不保持深度的計數在被串化的對象中。 – adeneo

回答

0

我終於找到了一種方法。但我不確定這是做到這一點的最佳方式:s。

這裏是我補充說:

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

您可以實現toJson功能到你的對象,並處理其內這種情況下,那麼當你調用JSON.stringify將會從返回目的。

Difference between toJSON() and JSON.Stringify()

+0

我已經試過這:)。問題在於,即使對於我的對象中不夠深的項目,它也會始終返回id。 –

0

我會假設你所說的 「參考文獻」(ab & c)的字符串。

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

對不起,但我沒有看到任何可能的方法來適應我的需要:s。 你可以查看我的第一篇文章,瞭解更多詳情:) –

相關問題