一種可能的解決方案是創建一個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()
。
聽起來很不錯,可以動態創建'range()'和'domain()'數組。我會支持的。 – xmashallax