通过d3文档,我看到这个代码(身份函数)无处不在:
function(d) { return d; }
d3中是否有内置方式来执行此操作?我知道我可以创建自己的无操作身份功能并在任何地方使用它,但似乎d3应该提供此功能。
答案 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数量,包括身份函数。