【问题标题】:Finding maximum of the selected column in loaded csv data in Javascript在Javascript中找到加载的csv数据中所选列的最大值
【发布时间】:2025-12-20 15:40:16
【问题描述】:
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][“header”]的详细信息,它是相应标题的列值,我想将每个值除以 ma​​x 值在整个专栏中。基本上应该是这样的——

temp.push((d[status[i]["headers"]]/Math.max(temp)) * status[i]["value"])

但我无法获得整列的 ma​​x

这是当前代码,但还想取 ma​​x 并除以每个值以对其进行标准化,然后乘以 status[i]["value"]

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"]) 
    }
  }
});
});
}

status 是具有这种格式的数组。

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 另一个对应于相应的标题 Z。我想要与 YZ 对应的所有列值的 ma​​x 但不是 YY 中的最大值强>Z

【问题讨论】:

    标签: javascript csv d3.js


    【解决方案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)
    })
    

    【讨论】:

    • 请检查问题,经过您的回答,我再次更新。
    • 好吧,我写错了循环。我的观点是,您需要计算第一个 foreach 循环中列的最大值,然后再次使用 foreacg 使用计算的最大值来划分值。
    • 这意味着 maxTemp 应该是一个数组,而不是普通变量?如果你答对了,你能更新你的答案吗?
    • 我会写一个伪代码让你明白我的意思。如果我做对了,你来评判。
    • 是的,当然,我会看看这是否是我想要的。感谢您的帮助
    【解决方案2】:

    由于您的问题的标题与您的问题文本有点不同,我将仅解决问题的标题。我希望它适合你。

    您可以使用 D3 方法 d3.max 找到任何列的最大值,其中:

    使用自然顺序返回给定数组中的最大值。如果数组为空,则返回 undefined。可以指定一个可选的accessor函数,相当于在计算最大值之前调用array.map(accessor)。

    所以,鉴于这个伪造的 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)
    pre {
      display: none;
    }
    <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>

    【讨论】:

    • 我不知道你为什么这么认为,因为我已经在问题标题中说“选定的列”也在问题中,最后两个 Y 和 Z。你建议的那个是可能的你已经知道并尝试所有。
    • 就是这么简单,只需要在对象中使用括号表示法就可以了……反正我要删了。
    • 你不必,我从中得到一些想法。
    • var maxFoo = []; for(var i=0;i
    • 请复制/粘贴您的数据数组结构(不是全部,只是几行)。