2016-01-26 55 views
2

我從API獲取JSON結構,我想在前端進行更改。前端將一個屬性添加到JSON結構「isHidden」。當我發送修改後的JSON時,我不希望將具有「isHidden」的對象發送回API,但我仍然會將其保存在我自己的MongoDB中。刪除JSON的父對象(如果它具有某個屬性)

但是,這樣做顯然比我想象的要困難得多。我做了這個功能至極的作品,但我覺得非常難看:

function removeHiddenObject(data,parent){ 
    for(var property in data){ 
     if(data.hasOwnProperty(property)){ 
      if(property == "isHidden" && data[property] === true){ 
       parent.splice(parent.indexOf(data), 1); 
      } 
      else { 
       if(typeof data[property] === "object") { 
        removeHiddenObject(data[property], data); 
       } 
      } 
     } 
    } 
    return data; 
} 

這是一個遞歸方法,但我覺得它的方式複雜和怪異。有沒有簡化我的任務的方法?

這裏是一個的jsfiddle你,如果你想幫幫忙:https://jsfiddle.net/vn4vbne8/

+0

將JSON視爲一個字符串並替換'isHidden'然後再將該字符串轉換回JSON! – Sachin

回答

1

使用此代碼從JSON字符串中刪除:

myJson=s.replace(/,*\s*"[^"]"\s*\:\s*{(.*?)"isHidden"\:([^}]*)}/gm,""); 

要小心,在正則表達式中的每個字符很重要,完全使用上面的代碼。 它刪除每個屬性都有一個屬性isHidden的對象。

+0

我實際上想要移除「isHidden」所附帶的整個對象。所以如果它有屬性isHidden,所有的兄弟屬性也應該被刪除。這不是這樣嗎?還是呢? – petur

+1

我編輯了答案,現在它就像剛剛說的那樣工作。 – nAviD

+0

好的,這顯然不符合我的公司政策,儘可能避免正則表達式。我會標記這個答案正確,因爲它的工作原理。 – petur

1

Javascript實際上支持不可枚舉的公共屬性。我假設當你發送數據回服務器時,你首先使用JSON.stringify將其字符串化,這隻會將對象的公共枚舉爲的屬性串聯起來。

可以定義這樣一個不可枚舉的屬性(關於這一點here):

Object.defineProperty(obj, 'isHidden', { 
    enumerable: false, 
    writable: true 
}); 

哪裏obj是你想要的屬性添加到與isHidden的JavaScript對象是屬性的名稱你正在增加。以這種方式完成後,新屬性將以obj.isHidden的形式訪問,但不會顯示在JSON.stringify輸出中,也不會顯示在for循環中。

+0

哇。好答案。我從來不知道這一點。 –

+0

我想要將'isHidden'屬性附加到的整個屬性移除。這不能解決這個問題嗎? – petur

相關問題