D3.js 删除D3中的所有svg元素,保存一些指定的

D3.js 删除D3中的所有svg元素,保存一些指定的,d3.js,D3.js,那么,如何从svg对象g1和g2组中删除所有元素? 类似于: const svg=d3.append("svg").attr(...) const g1=svg.append("g").attr("id","g1").attr(...) var v1=g1.append(...) ... // many other nested append operations const g2=g1.append("g").attr("id","g2").attr(...) var v2=g2.appen

那么,如何从svg对象g1和g2组中删除所有元素? 类似于:

const svg=d3.append("svg").attr(...)
const g1=svg.append("g").attr("id","g1").attr(...)
var v1=g1.append(...)
... // many other nested append operations 
const g2=g1.append("g").attr("id","g2").attr(...)
var v2=g2.append(...)
... // many other nested append operations

这不起作用。

我会将一个类应用于所有要保留的元素,例如:

svg.selectAll("*:not('#g1'):not('#g2')").remove();
然后,您可以使用CSS选择器选择SVG中没有该类的所有元素,例如:

const svg=d3.append("svg")
  .attr(...)

const g1=svg.append("g")
  .attr(...)
  .classed('doKeep', true)

var v1=g1.append(...)

// After adding many nested elements to g1
g1.selectAll('*')
  .classed('doKeep', true)

...

const g2=g1.append("g")
  .attr(...)
  .classed('doKeep', true)

var v2=g2.append(...)
...

// After adding many nested elements to g1
g2.selectAll('*')
  .classed('doKeep', true)
反之亦然,即标记所有要删除的图元,然后在选择它们后将其删除。但从你的问题的措辞来看,这是最准确的方法

希望这有帮助


编辑:已更新以反映指定许多嵌套元素的已更新问题。

您的选择器字符串有点不正确:not伪类不需要ID周围的任何引号。svg.selectAll*:notg1:notg2.remove;会很好用的。看一看。我投票决定结束这篇文章,因为它只是一个小的打字错误。@altocumulus我不认为这个打字错误修正了@tic的问题。尽管您的更正是正确的,但g1和g2元素的所有子元素也会被该操作删除,我怀疑@tic后面是什么。@matthias.rocks在这种情况下是svg。选择AllSVG>g:notg1:notg2.remove;行。问题中没有足够的信息来提供一个更详细的答案,而不是靠猜测。@altocumulus这确实是一个很好的解决方案,它非常适合@tic概述的示例。可能会将其更改为svg。选择AllSVG>*:notg1:notg2.remove可删除svg的所有子体,而不仅仅是g元素。
svg.selectAll(':not(.doKeep)').remove()