2017-08-16 79 views
2

刪除值的列表我具有如遞歸從對象

ids = [6,9] 

ID的列表和一個對象,它是作爲

data = { 
    "child": [{ 
      "fruit": "apple", 
      "id": 1 
     }, 
     { 
      "fruit": "mango", 
      "id": 2, 
      "child": [{ 
       "name": "js", 
       "id": 4 
      }, { 
       "name": "jsk", 
       "id": 6 
      }] 
     }, 
     { 
      "fruit": "banana", 
      "id": 9 
     } 
    ] 
} 

我必須遍歷數據,以找到對象的數組在ids.Here名單與現有ID的任何對象我要刪除

{"name":"jsk", "id": 6} 

{"fruit":"banana","id":9} 

爲了實現這一點,我已經寫了下面的代碼

deleteObj = (data, ids) => { 
    data.child.forEach((key, index) => { 
    if(key && ids.indexOf(child.id) > -1){ 
     console.log("inside match before", key); 
     key.splice(index, 1); 
     console.log("inside match after: ", key); 
    } 
    if(key.child) { 
     deleteObj(key, ids); 
    } 
    }) 
}; 

但在獲得第一後,此功能匹配它只是return.Deliting只有第一個匹配的ID。 普林只有inside match after:9
無法找到任何錯誤

+0

是什麼'findBookmarkDeletedIds' – Dij

+0

你有deleteObj內的兩個問題。在第一個if語句中,你檢查'child.id',但你應該檢查'key.id'。其次,你的拼接調用應該在data.child而不是'key'上調用。 – vox

回答

1

你可以使用一個簡單的循環while和結束迭代,因爲剪接刪除實際指標與前進,你會得到一個未經處理的項目。

function deleteItems(array, ids) { 
 
    var i = array.length; 
 
    while (i--) { 
 
     if (ids.indexOf(array[i].id) !== -1) { 
 
      array.splice(i, 1); 
 
      continue; 
 
     } 
 
     array[i].child && deleteItems(array[i].child, ids); 
 
    } 
 
} 
 

 
var ids = [6, 9], 
 
    data = { child: [{ fruit: "apple", id: 1 }, { fruit: "mango", id: 2, child: [{ name: "js", id: 4 }, { name: "jsk", id: 6 }] }, { fruit: "banana", id: 9 }] }; 
 

 
deleteItems([data], ids) 
 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

當你循環和刪除元素形成原始數組你一個問題,因爲數組被重新索引,你跳過一些元素,所以不是你可以循環反向。

var data = {"child":[{"fruit":"apple","id":1},{"fruit":"mango","id":2,"child":[{"name":"js","id":4},{"name":"jsk","id":6}]},{"fruit":"banana","id":9}]} 
 

 
function deleteById(data, ids) { 
 
    if (Array.isArray(data)) { 
 
    var i = data.length - 1; 
 
    while (i > 0) { 
 
     if (ids.includes(data[i].id)) data.splice(i, 1) 
 
     deleteById(data[i], ids) 
 
     i -= 1; 
 
    } 
 
    } else if (typeof data == 'object') { 
 
    for (var i in data) { 
 
     if (typeof data[i] == 'object') deleteById(data[i], ids) 
 
    } 
 
    } 
 
} 
 

 
deleteById(data, [6, 9]) 
 
console.log(data)