我使用Pentaho(ETL)工具使用javascript组件实现输出,该组件接受javascript代码以实现所需的转换。下表从.csv文件(源文件)导入pentaho。 例如,这是我的表结构
+--------+--------+--------+
| RLD | MD | INC |
+--------+--------+--------+
| 0 | 3868 | 302024 |
| 53454 | 7699 | 203719 |
| 154508 | 932 | 47694 |
| 107547 | 36168 | 83592 |
我想使用一个脚本,它会给我max_value及其索引号,这样我的输出看起来像 输出表
+--------+--------+--------+-----------+-----------+
| RQD | MT | IZC | max_value | max_index |
+--------+--------+--------+-----------+-----------+
| 0 | 3868 | 302024 | 302024 | 3 |
| 53454 | 7699 | 203719 | 203719 | 3 |
| 154508 | 932 | 47694 | 154508 | 1 |
| 456 | 107547| 83592 | 107547 | 2 |
从我使用过的行中获取最大值
var max_value = Math.max(RQD,MT,IZC);
println(max_value);
我尝试使用以下脚本获取索引
var max_index = switch (Math.max(RQD,MT,IZC))
{
case "RQD":document.write("1")
case "MT":document.write("2")
case "MT":document.write("3")
default:document.write("0")
}
如何以javascript数据结构的形式获得所需的结果?任何帮助将不胜感激。谢谢
答案 0 :(得分:0)
您的代码存在一些问题,请解决它们!
使用中断:您必须使用中断以避免开关移动到低于其匹配的情况。
切换案例不返回类似函数的值,不能使用switch返回来定义变量,需要在switch case中定义变量。
Math.max不会返回其最大变量的名称,而是从其给定的参数返回最大值number
。
要解决这个问题,说实话,我不会使用带math.max的开关案例,但要回答你的问题:
var tableArray = [RQD,MT,IZC];
var maxIndex = tableArray.indexOf(Math.max.apply(null, arr));
if(maxIndex > -1) document.write(maxIndex+1);
我使用了+1,因为示例表中的索引从1开始而不是0。
数组的排序方式应与每个原始表的排序方式相匹配。
答案 1 :(得分:0)
var list = [
{RLD:0,
MD:3868,
INC:302024
},
{RLD:53454,
MD:7699,
INC:203719
},
{RLD:154508,
MD:932,
INC:47694
},
{RLD:107547,
MD:36168,
INC:83592
},
];
list = list.map(function(item){
var keys = Object.keys(item);
item.max_value = item[keys[0]];
item.max_index = '';
for(var i = 1, l = keys.length; i < l; i++) {
var key = keys[i];
var keyValue = item[key];
if (item.max_value < keyValue){
item.max_value = keyValue;
item.max_index = key;
}
}
return item;
})
答案 2 :(得分:0)
首先,您无法使用开关语句解决此问题。
在javascript 开关中,您应该提供一个跟随案例之一的值,否则开关将转到如果已定义默认。
您的问题似乎是找出3列的较高值并打印出来,逐列逐列添加一个具有最大值的列和您找到它的列的索引。
例如在行上:
1,RLD:0
2,MD:3868
3,INC:302024
在这种情况下,较高的值是 INC ,列索引 3 。
如果您只拥有带数值的变量,那么除此之外什么都不做:
function getMaxValueRow (RLD, MD, INC) {
var max_value = RLD;
var max_index = 1;
if (MD > max_value) {
max_value = MD;
max_index = 2;
}
if (INC > max_value) {
max_value = INC;
max_index = 3;
}
return [RLD, MD, INC, max_value, max_index];
}
你可以像这样返回一个对象:
retrun {
'RQD': RLD,
'MT': MD,
'IZC': INC,
'max_value': max_value,
'max_index': max_index
}