2017-05-29 115 views
1

鑑於對象數組這樣任何級別刪除項目:在JS嵌套的對象陣列

var items = [{ 
    id: 1 
}, { 
    id: 2, 
    child: { 
    id: 3 
    } 
}, { 
    id: 4, 
    child: { 
    id: 5, 
    child: { 
     id: 6 
    } 
    } 
}]; 

我需要一種方法在任何水平,以除去一個項目。這段代碼做我想要的,但有沒有更好的方法?

最初我嘗試使用一個遞歸函數來做,但無法讓它工作。

var removed = removeItems(items, 5); 
print(removed); 

function removeItems(items, id) { 
    items.forEach(function(item, index, allItems) { 
    if (item.id === id) { 
     items.splice(index, 1); 
    } 
    if (item.child) { 
     item = testChild(item, item.child, id); 
    } 
    }); 
    return items; 
} 

function testChild(parent, child, id) { 
    if (child.id === id) { 
    delete parent.child 
    return parent; 
    } else { 
    if (child.child) { 
     return testChild(child, child.child, id); 
    } 
    return parent; 
    } 
} 

function print(obj) { 
    document.querySelector('#out').innerHTML += JSON.stringify(obj, null, 2); 
} 

的jsfiddle:https://jsfiddle.net/syvf46uL/12/

回答

1

這裏是一個通用的去除,只要你想,應該工作的功能。

var items = [{ 
 
    id: 1 
 
    }, { 
 
    id: 2, 
 
    child: { id: 3 } 
 
    }, { 
 
    id: 4, 
 
    child: { 
 
     id: 5, 
 
     child: { 
 
     id: 6 
 
     } 
 
    } 
 
    } 
 
]; 
 

 
function remove(src, predicate) { 
 
    
 
    // for Array 
 
    if (Array.isArray(src)) { 
 
    for (var i=src.length-1; i>-1; i--) { 
 
     if (predicate(src[i])) { 
 
     src.splice(i, 1); 
 
     } else { 
 
     remove(src[i], predicate); 
 
     } 
 
    } 
 
    } 
 
    
 
    // for Object 
 
    else { 
 
    for (var i in src) { 
 
     if (predicate(src[i])) { 
 
     delete src[i]; 
 
     } else { 
 
     remove(src[i], predicate); 
 
     } 
 
    } 
 
    } 
 
} 
 

 
// remove id == 1 
 
remove(items, function(element) { 
 
    return element.id && element.id == 1; 
 
}); 
 

 
console.log(JSON.stringify(items)); 
 

 
// remove id == 6 
 
remove(items, function(element) { 
 
    return element.id && element.id == 6; 
 
}); 
 

 
console.log(JSON.stringify(items));

一個重要的問題,你的代碼,一個很常見的錯誤,是你試圖縮小陣列 - 通過splice方法 - 而迭代前進。這會導致您每次刪除元素時都跳過一個元素。

想想這樣,你正在迭代0->length;你刪除了ith元素;現在你以前的(i + 1)th元素已經成爲你的ith元素;但是您仍在迭代0->length,從而導致您跳過新元素ith並轉到(i + 1)th元素,該元素是您以前的(i + 2)th元素。這是通過向後迭代來解決的length->0;數組的收縮不會影響迭代器,因爲收縮總是從i+1->length開始,但是您從i->0開始迭代。

+0

謝謝EyuelDK –