6

Looking through the d3 docs, I see this code (the identity function) repeated everywhere:

function(d) { return d; }

Is there a built-in way in d3 to do this? I know I could create my own no-op identity function and use it everywhere, but it seems like d3 should provide this.

4

2 回答 2

4

我想知道为什么没有d3.identity函数作为库的一部分,并且找不到没有的理由。

从性能的角度来看,定义一个恒等函数比重用构造函数提供了更好的性能Object。如果您在不同类型之间重用相同的标识函数,则几乎没有什么区别。一些性能测试在这里

所以就我而言,我滥用 D3 并自己添加了该功能:

d3.identity = function(d) { return d; }

如果您使用下划线,那么您也可以使用_.identity函数。

关于使用Object构造函数,我的假设是每次调用它都会创建一个新的、不必要的对象,这会浪费内存和 CPU 时间,用于创建和垃圾收集。这可能会针对某些运行时中的数字等不可变类型进行优化。

EDIT Phrogz 有一篇简短的文章,展示了在使用 D3 时减少 lambda 数量的一些有用的简写,其中包括一个标识函数。

于 2013-10-21T16:56:37.827 回答
3

我曾经看到 Mike 做 .data(Object) 似乎有效

http://tributary.io/inlet/5842519

但我不知道为什么我不再看到它了

var svg = d3.select("svg")

var data = [[10,20],[30,40]];
svg.selectAll("g")
.data(data)
.enter()
.append("g")
.attr("transform", function(d,i) { return "translate(" + [i * 100, 0] + ")"})
.selectAll("circle")
//.data(function(d) { console.log(d); return d })
.data(Object)
.enter()
.append("circle")
.attr({
  cx: function(d,i) { return 100 + i * 40 },
  cy: 100,
  r: function(d,i) { return d }
})
于 2013-06-22T20:46:03.657 回答