如何在将数组的每个值分配给DOM中的所有svg的同时一遍又一遍地迭代数组
How can I iterate through an array over and over again while assigning each of its values to all the svgs in my DOM
如果我的问题措辞不好,很抱歉。我是个初学者,不知道事物的正确标签。
我正在用d3.js制作一张日本地图,并想为每个都道府县指定一种颜色。每个县都有自己的svg。我有一个我想使用的颜色的十六进制值的数组,基本上我想写一个函数,将数组的第一种颜色分配给第一个svg的"fill"属性,第二种分配给第二个svg,依此类推。颜色在某个时候必须重复,因为有太多的县。我真的很难构思如何去做这件事,我很乐意得到任何帮助!我的代码在下面。我想代码应该放在javascript的底部,我有?议论
此外,这方面的基础来自Mike Bostock的"让我们制作地图"教程(如果有帮助的话)。
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<style>
</style>
</head>
<body>
<script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script src="//d3js.org/topojson.v1.min.js"></script>
<script>
var width = 960;
var height = 1160;
/* list of colors to iterate thru for prefecture color */
var colors = ["#8dd3c7", "#ffffb3", "#bebada", "#fb8072", "#80b1d3",
"#fdb462", "#b3de69", "#fccde5", "#d9d9d9"];
var projection = d3.geo.mercator()
.center([138.3, 39.2])
.scale(1500);
var path = d3.geo.path()
.projection(projection);
var svg = d3.select("body").append("svg")
.attr("height", height)
.attr("width", width);
/* draws the map. try to make a loop in here which uses the data id of
the prefectures to uses the color list above to differentiate pref*/
d3.json("japanv2.json", function(error, japan) {
svg.selectAll(".prefecture")
.data(topojson.feature(japan, japan.objects.prefectures).features)
.enter().append("path")
.attr("class", function (d) { return "prefecture " + d.id; })
.attr("d", path)
/*?*/ .attr("fill",
}
});
</script>
</body>
</html>
将其放入属性中:
.attr("fill", function(d,i){
return colors[i%colors.length]
});
这个片段的作用是什么
首先,function(d,i)
中的i
返回每个路径的索引。所以,如果你这样做:
.attr("fill", function(d,i){
console.log(i);
return colors[i%colors.length];
});
你会在你的控制台上看到一堆数字。假设您有200条路径,那么i
将从0变为199。
现在是模运算符:
x % y
它返回除法的余数。所以,假设你的colors
是一个有9种颜色的阵列,这个:
i % colors.length
将返回此序列:
0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1 etc
可以用来获取colors
值。
附言:在地图中,任何地图中,我们只需要4种颜色就可以避免任何两个颜色相同的区域有共同的边界!(难以置信,我知道…)
我以前从未使用过D3,但跟踪您在数组中的位置还不错。
首先,我将使用另一个变量跟踪您在数组中的位置,该变量可能设置在var colors
行下。
var currentColor = 0;
然后,当您更改地区颜色时,您可以使用引用阵列中的当前位置
colors[currentColor]
完成此操作后,您将希望使用以下内容更新当前颜色:
currentColor++;
if (currentColor == colors.length) {
currentColor = 0;
}
这会增加currentColor值+1,然后在使用最后一种颜色后将其重置回0。这样,如果你有更多的县,你可以使用从头开始的颜色。
更新
仔细查看您的代码,我想我在回答中提到的colors[currentColor]
会在这一行的逗号后面:
/*?*/ .attr("fill",
- 第一个字第一个字符第二个字第二个字符,一直到数组结束
- jQuery对象从html表中查询为两个一维数组,用于Chartist图表
- 如何在Java Script中比较二维数组和一维数组,并将常见数据存储在另一个数组中
- 如何在javascript中使用2个一维数组创建层次结构树
- PHP json_encode不适用于一维数组
- 如何在一维数组中存储 3 个随机数,然后在 Javascript 中收到警报
- 将字符串的一维数组转换为二维数组
- 节点.js遍数组不显示整个对象
- Javascript使用map从一维数组创建一个二维数组
- PHP 循环通过多维到一维数组
- 使用JavaScript将对象的多维数组转换为一维数组
- 用一维数组过滤多维数组
- mongoose.js:我如何从引用的子数组中删除一个属性,同时使用填充和使用其中一个子数组字段作为过滤器
- 使用Angulajs在嵌套数组中动态添加一个子数组
- 在JS中根据需要的组大小将一维数组转换为多维数组的更好方法
- 我的Javascript for循环工作在除了一个子数组以外的所有子数组上
- 如何在JavaScript中将2个一维数组连接成1个二维数组
- 如何将深度多维数组转换为一维数组-Javascript
- 使用JavaScript将一维数组转换为二维数组
- D3.js:通过 d3 加载平面一维数组.csv导致“类型错误:组数据未定义”/使用 D3.js 加载多个 CSV 文件