目前我正在研究递归方法。
'数组'有'对象',它们有自己的parentId和Id。
我想做一个函数:当我选择一个对象时,想通过parentId删除每个子对象。同时也应该删除孩子的孩子。
现在,此代码适用于某些子对象,但并非适用于所有子对象。我不知道为什么它不起作用。
你能帮我解决一下这个问题吗?
function deleteMindMap(obj) {
alert('Before Delete : ' + JSON.stringify(savedArray));
savedArray = deleteUsingParentId(savedArray, obj.id);
alert('After Delete : ' + JSON.stringify(savedArray));
//Rewriting to firebase
mindRef.remove();
writeMindMap(savedArray);
}
function deleteUsingParentId(data, parentId) {
var updatedArray = savedArray.filter((item) => {
return item.parent != parentId;
})
return updatedArray;
}
尝试了代码,但仍然没有处理父对象和子的子对象。
当我删除id为'12'的对象时,这是代码的结果
导致'123','1234'的父ID为'12',
'123456789 1234567890','12345,123456'应删除
因为他们是'123'和'1234'的孩子
并且'12'也不会被删除。
Before Delete : [
{"afterX":485,"afterY":271,"id":"1","kind":"line","parent":"1","x":448,"y":220},
{"afterX":643,"afterY":276,"id":"12","kind":"line","parent":"1","x":490,"y":278},
{"afterX":732,"afterY":238,"id":"123","kind":"line","parent":"12","x":659,"y":283},{"afterX":708,"afterY":413,"id":"1234","kind":"line","parent":"12","x":668,"y":291},
{"afterX":847,"afterY":390,"id":"12345","kind":"line","parent":"1234","x":721,"y":418},
{"afterX":791,"afterY":494,"id":"123456","kind":"line","parent":"1234","x":715,"y":427},
{"afterX":904,"afterY":520,"id":"1234567","kind":"line","parent":"123456","x":810,"y":503},
{"afterX":944,"afterY":301,"id":"12345678","kind":"line","parent":"1234567","x":913,"y":521},
{"afterX":796,"afterY":136,"id":"123456789","kind":"line","parent":"123","x":736,"y":230},
{"afterX":869,"afterY":227,"id":"1234567890","kind":"line","parent":"123","x":752,"y":245}]
After Delete : [{"afterX":485,"afterY":271,"id":"1","kind":"line","parent":"1","x":448,"y":220},
{"afterX":643,"afterY":276,"id":"12","kind":"line","parent":"1","x":490,"y":278},
{"afterX":847,"afterY":390,"id":"12345","kind":"line","parent":"1234","x":721,"y":418},
{"afterX":791,"afterY":494,"id":"123456","kind":"line","parent":"1234","x":715,"y":427},
{"afterX":904,"afterY":520,"id":"1234567","kind":"line","parent":"123456","x":810,"y":503},
{"afterX":944,"afterY":301,"id":"12345678","kind":"line","parent":"1234567","x":913,"y":521},
{"afterX":796,"afterY":136,"id":"123456789","kind":"line","parent":"123","x":736,"y":230},
{"afterX":869,"afterY":227,"id":"1234567890","kind":"line","parent":"123","x":752,"y":245}
]
我认为这应该做你想要的。如果你有循环依赖,它可能会中断。它仍然使用递归,但我在filter
函数内移动了递归。
function deleteChild(id){
function filter(_target){
let toDelete = [];
for(let i = 0; i < savedArray.length; i++){
if(savedArray[i].id == _target || savedArray[i].parent == _target){
toDelete.push(i);
if(savedArray[i].id != _target){
toDelete = toDelete.concat(filter(savedArray[i].id).slice(1));
}
}
}
return toDelete;
}
const targets = filter(id).sort();
for(let i = targets.length - 1; i >= 0; i--){
savedArray.splice(targets[i],1);
}
}
在你的例子中,你省略了1234567
和12345678
,他们也应该被删除。 1234567
是123456
的孩子,被删除,12345678
是1234567
的孩子
所以这是我对这个问题的理解:
var savedArray = [
{
afterX: 485,
afterY: 271,
id: "1",
kind: "line",
parent: "1",
x: 448,
y: 220
},
{
afterX: 643,
afterY: 276,
id: "12",
kind: "line",
parent: "1",
x: 490,
y: 278
},
{
afterX: 732,
afterY: 238,
id: "123",
kind: "line",
parent: "12",
x: 659,
y: 283
},
{
afterX: 708,
afterY: 413,
id: "1234",
kind: "line",
parent: "12",
x: 668,
y: 291
},
{
afterX: 847,
afterY: 390,
id: "12345",
kind: "line",
parent: "1234",
x: 721,
y: 418
},
{
afterX: 791,
afterY: 494,
id: "123456",
kind: "line",
parent: "1234",
x: 715,
y: 427
},
{
afterX: 904,
afterY: 520,
id: "1234567",
kind: "line",
parent: "123456",
x: 810,
y: 503
},
{
afterX: 944,
afterY: 301,
id: "12345678",
kind: "line",
parent: "1234567",
x: 913,
y: 521
},
{
afterX: 796,
afterY: 136,
id: "123456789",
kind: "line",
parent: "123",
x: 736,
y: 230
},
{
afterX: 869,
afterY: 227,
id: "1234567890",
kind: "line",
parent: "123",
x: 752,
y: 245
}
];
function removeByIds(arr, parentIdsToBeRemoved) {
// if there is no parentIdsToBeRemoved return whole array
if (!parentIdsToBeRemoved || parentIdsToBeRemoved.length == 0) {
return arr;
}
var tempIdsToBeRemoved = [];
var newArr = arr.filter((item, index) => {
if (parentIdsToBeRemoved.indexOf(item.parent) > -1) {
tempIdsToBeRemoved.push(item.id);
} else {
return item;
}
});
return removeByIds(newArr, tempIdsToBeRemoved);
}
function removeById(arr, id) {
return arr.filter(item => {
return item.id != id;
})
}
var output = removeByIds(savedArray, ["12"]);
output = removeById(output, "12");
console.log(output);