一种可能的解决方案是创建一个Object
将水果映射到颜色的方法,例如
var fruit2color = {apple: "red", durian: "green", lemon: "yellow"}
然后,给定一个 列表fruits
,您可以使用 . 创建颜色范围map
。map
遍历数组中的每个水果并返回一个包含每个水果颜色的数组。颜色是您放入的颜色fruit2color
,或者如果水果没有指定颜色,则只是'brown'
。
var fruits = ["lychee", "chiku", "durian", "plantain", "guava", "apple"];
var colors = fruits.map(function(f){
return f in fruit2color ? fruit2color[f] : "brown"
});
var color = d3.scale.ordinal()
.domain(["apple", "durian", "lemon"])
.range(colors);
这段代码会给你一个颜色范围
colors = [ 'brown', 'brown', 'green', 'brown', 'brown', 'red' ]
至于问题的第二部分,您可以使用fruit2color
带有正则表达式的函数(而不是对象)来分配颜色,例如
var patt = /lemon./;
function fruit2color(f){
if (patt.test(f)) return "yellow";
else if (f == "apple") return "red";
else if (f == "durian") return "green";
else return "brown";
}
var colors = fruits.map(fruit2color);
然后将生成的颜色传递array
给range()
.