按对象的 ID 删除对选定对象的对象引用



>我有一个节点系统,它存储了一堆连接到其他节点的节点。数据结构如下:

[
 {"id":0,"x":1,"y":2, "linksTo":[1]},
 {"id":1,"x":3,"y":4, "linksTo":[0,2,3]},
 {"id":2,"x":5,"y":6, "linksTo":[1,4]},
 {"id":3,"x":3,"y":10,"linksTo":[1,4]},
 {"id":4,"x":5,"y":12,"linksTo":[2,3]}
]

我正在尝试做的是删除某个节点,以及可能根据其 ID "链接"到它的其他节点中对该节点的所有引用。

我已经到了可以使用这个函数获得我需要的节点的地步:

function getNode(id, y){
    var x;
    if(y){ x = id; }   
    if(x && y){
        var nodeAtPos = false; 
        Object.keys(paths.list).forEach(function(i){
            if(paths.list[i].x == x && paths.list[i].y == y){
                nodeAtPos = paths.list[i];
                return false;
            }
        return true;
        });        
    return nodeAtPos;
    } 
    return paths.list[id];
}
function deleteNode(x,y){
    var obj = getNode(x,y);
//need to delete obejct and delete key references in other objects that were connected to it
}
deleteNode(5,12);

最终结果在我的数据结构中如下所示:

[
 {"id":0,"x":1,"y":2, "linksTo":[1]},
 {"id":1,"x":3,"y":4, "linksTo":[0,2,3]},
 {"id":2,"x":5,"y":6, "linksTo":[1]}, //changed
 {"id":3,"x":3,"y":10,"linksTo":[1]}, //changed
]

但是正如您在我的数据结构中看到的那样,如果我简单地删除它,我仍然有一些linksTo的节点需要清理。否则,它们将被链接到不存在的节点。

最简单的方法是什么?

您可以iterate每个对象并执行以下操作:

  • 检查node是否有其链接。如果是这样,请将其从其中删除 linkTo .
  • 在迭代过程中,index跟踪具有其id为要删除的节点。
  • 迭代完成后,从数组中remove节点。

法典:

var x = [
 {"id":0,"x":1,"y":2, "linksTo":[1]},
 {"id":1,"x":3,"y":4, "linksTo":[0,2,3]},
 {"id":2,"x":5,"y":6, "linksTo":[1,4]},
 {"id":3,"x":3,"y":10,"linksTo":[1,4]},
 {"id":4,"x":5,"y":12,"linksTo":[2,3]}
];
var index = -1;
var toDel = 2;
for(var i=0;i<x.length;i++){
    if(x[i]["linksTo"].indexOf(toDel) != -1){
        x[i]["linksTo"].splice(x[i]["linksTo"].indexOf(toDel),1);
    }
    if(x[i]["id"] == toDel){index = i;}
}
if(index != -1){
    x.splice(index, 1);
}
console.log(x);

没有其他方法,只能更新其余元素的 linksTo 值

var deletedId = 4;
var arr = [
 {"id":0,"x":1,"y":2, "linksTo":[1]},
 {"id":1,"x":3,"y":4, "linksTo":[0,2,3]},
 {"id":2,"x":5,"y":6, "linksTo":[1,4]},
 {"id":3,"x":3,"y":10,"linksTo":[1,4]},
];
for (var i=0 ; i  < arr.length ; i++ ) {
   var node = arr[i];
   var newRef = [];
   for (var l=0 ; l < node.linksTo.length; l++) { // l is an index for links
     if (node.linksTo[l] != deletedId)
       newRef.push(node.linksTo[l])
   }
   node.linksTo = newRef;  // assign new array
}

最新更新