function myFunction() {
dd = document.getElementsByClassName("addin");
ds = document.getElementsByClassName("slidfi");
var arr = [];
for(var i = 0;i< dd.length;i++){
var obj = {};
obj["check"] = dd[i].checked;
obj["value"] = ds[i].value;
obj["headers"] = dd[i].value;
arr.push(obj)
}
return arr;
}
以下函数中的状态变量具有值和状态[i] [&#34;标题&#34;]的详细信息,这是相应标题的列值,我想将每个值除以 max 整栏中的值。它基本上应该是这样的 -
temp.push((d[status[i]["headers"]]/Math.max(temp)) * status[i]["value"])
但是我无法获得整列的 max 。
以下是当前代码,但也想取 max 并除以每个值以对其进行标准化,然后乘以 status [i] [&#34; value&#34;] < /强>
function UpdatedData() {
var status = myFunction();
d3.csv('cars.csv', function(error, data) {
data.forEach(function(d){
var temp=[];
for(var i=0;i<status.length;i++){
if (status[i]["check"]){
temp.push(d[status[i]["headers"]] * status[i]["value"])
}
}
});
});
}
状态是具有此格式的数组。
0 {check: false, value: "0.5", headers: "W"}
1 {check: false, value: "0.5", headers: "X"}
2 {check: true, value: "0.5", headers: "Y"}
3 {check: true, value: "0.5", headers: "Z"}
所以最后两个被检查,所以在这种情况下, temp 将是一个昏暗的数组2.一个将对应于标题 Y 和其他对应的标题ž即可。我希望最大对应 Y 和 Z 的所有列值,但不是 Y 和ž
答案 0 :(得分:1)
您需要首先计算循环中整个列的最大值,执行类似
的操作maxTemp = 0;
for(var i=0;i<status.length;i++){
if (status[i]["check"]){
if(maxTemp < d[status[i]["headers"]])
maxTemp = d[status[i]["headers"]];
}
}
然后使用另一个循环中的maxTemp
进行划分
for(var i=0;i<status.length;i++){
temp.push((d[status[i]["headers"]]/maxTemp) * status[i]["value"])
}
**伪代码**
maxTemp = 0;
data.forEach(function(d){
//some code
if(maxTemp < d[status[i]["headers"]])
maxTemp = d[status[i]["headers"]];
}
})
data.forEach(function(d){
//some code
temp.push(value /maxTemp)
})
答案 1 :(得分:0)
由于您的问题标题与您的问题文字略有不同,我只会解决问题的标题。我希望它适合你。
您可以使用D3方法d3.max找到任意列的最大值,其中:
使用自然顺序返回给定数组中的最大值。如果数组为空,则返回undefined。可以指定可选的访问器函数,这相当于在计算最大值之前调用array.map(访问器)。
所以,鉴于这个虚假的CSV:
foo, bar, baz
12, 14, 65
26, 75, 39
67, 11, 93
19, 42, 17
我们可以找到foo
列的最大值:
var maxFoo = d3.max(data, function(d){ return d.foo});
为了找到最多两列或更多列,我们可以简单地创建一个具有单独最大值的数组:
var maxFooBar1 = d3.max([maxFoo, maxBar]);
或者,我们可以在每个对象中找到最大值:
var maxFooBar2 = d3.max(data, function(d){ return d3.max([d.foo, d.bar])});
这是一个演示(我使用pre元素来模拟CSV):
var data = d3.csvParse(d3.select("#csv").text());
data.forEach(function(d) {
d.foo = +d.foo;
d.bar = +d.bar;
d.baz = +d.baz;
})
var maxFoo = d3.max(data, function(d) {
return d.foo
});
var maxBar = d3.max(data, function(d) {
return d.bar
});
var maxFooBar1 = d3.max([maxFoo, maxBar]);
var maxFooBar2 = d3.max(data, function(d) {
return d3.max([d.foo, d.bar])
});
console.log("The max of foo is: " + maxFoo)
console.log("The max of foo and bar is (method 1): " + maxFooBar1)
console.log("The max of foo and bar is (method 2): " + maxFooBar2)
&#13;
pre {
display: none;
}
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
<pre id="csv">foo,bar,baz
12,14,65
26,75,39
67,11,93
19,42,17</pre>
&#13;