在Javascript中查找已加载的csv数据中所选列的最大值

时间:2017-05-08 19:36:36

标签: javascript csv d3.js

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 ž

2 个答案:

答案 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):

&#13;
&#13;
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;
&#13;
&#13;