d3中身份函数的简写是什么(“function(d){return d;}”)?

时间:2013-06-22 13:41:35

标签: javascript d3.js

通过d3文档,我看到这个代码(身份函数)无处不在:

function(d) { return d; }

d3中是否有内置方式来执行此操作?我知道我可以创建自己的无操作身份功能并在任何地方使用它,但似乎d3应该提供此功能。

2 个答案:

答案 0 :(得分:3)

我曾经看过迈克做.data(对象)似乎有用

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 }
})

答案 1 :(得分:3)

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

从性能的角度来看,定义身份函数比重用Object构造函数提供了更好的性能。如果在不同类型中重复使用相同的身份函数,则没什么区别。一些performance tests are here

所以在我的情况下,我滥用D3并自己添加了这个功能:

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

如果您正在使用underscore,那么您也可以使用_.identity功能。

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

编辑 Phrogz有brief article显示一些有用的简写,用于减少使用D3时的lambda数量,包括身份函数。