2016-07-25 82 views
1

我得出的結論是,這幾乎是不可能的。在下圖中,我試圖在不知道其父母的密鑰的情況下使用36 的密鑰刪除對象。 Picture of My Multidimensional JavaScript Object如何刪除多維JavaScript對象中的子對象?

我可以使用下面的函數(其中o是對象,id是關鍵字)找到36鍵的對象,但是,那麼,我無法看到要移除孩子來自對象的對象。

function findById(o, id) { 
    //Early return 
    if(o.id === id){ 
     return o; 
    } 
    var result, p; 
    for (p in o) { 
     if(o.hasOwnProperty(p) && typeof o[p] === 'object') { 
      result = findById(o[p], id); 
      if(result){ 
       return result; 
      } 
     } 
    } 
    return result; 
} 

在尋找另一個解決方案之前,我想我可能會問SO編程社區的專家。

[更新] 該解決方案其實很簡單(請參閱下面的答案)。我沒有意識到在遞歸的第一級o [p]是對實際對象的引用,這意味着delete o[p]將它從實際對象中刪除。

回答

1

如果你能找到它,你可以找到它的父母。如果你能找到它的父母,你可以刪除你正在尋找的密鑰。你可以修改你的功能來做到這一點。它將成功返回true

function deleteId(o, id) { 
    if(o.hasOwnProperty(id)) { 
     return delete o[id]; 
    } 
    var p; 
    for(p in o) { 
     if(o.hasOwnProperty(p) && typeof o[p] === 'object') { 
      var success = deleteId(o[p], id); 
      if(success) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
0

您應該返回包含該對象的對象,而不是使用該對象返回該對象。例如:

function findParentOfId(o, id) { 
    //Early return 
    if (o.id === id){ 
    return true; 
    } 
    var result, p; 
    for (p in o) { 
    if(o.hasOwnProperty(p) && typeof o[p] === 'object') { 
     result = findParentOfId(o[p], id); 
     if (result === true){ 
     return o; 
     } else if (typeof result === 'object') { 
     return result;  
     } 
    } 
    } 
    return result; 
} 

function deleteKey(key) { 
    parentObject = findParentOfId(key); 
    delete parentObject[key]; 
} 
0

使用replacer參數JSON.stringify

JSON.parse(JSON.stringify(input, function(key, value) { 
    return key === '36' ? undefined : value; 
}));