二维查找表 – 如何在javascript中存储标题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了二维查找表 – 如何在javascript中存储标题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3345字,纯文字阅读大概需要5分钟。
内容图文
![二维查找表 – 如何在javascript中存储标题](/upload/InfoBanner/zyjiaocheng/818/800ded23246c4ae88b014824accdf8a5.jpg)
我需要通过在基于两个值的表中查找结果来计算结果.表格是这样的:
Bar <10 20 30 40 50 60
Foo
<1.0 .14 .17 .22 .29 .31 .45
1.1 .16 .18 .25 .32 .37 .51
1.2 .19 .20 .29 .37 .41 .53
1.3 .21 .22 .32 .44 .49 .59
1.4 .25 .26 .34 .51 .52 .68
1.5 .29 .31 .39 .53 .54 .71
其中顶部的数字是Bar值的范围(给定的数字是范围的顶端),左侧的数字是Foo值的范围.如果我给了Bar = 24和Foo = 1.3,那么查找答案将是.32. (当然,上面的数字是组成的,真正的桌子大小约为25 X 25.)
所有这一切都必须在javascript中完成,包括存储查找值.
一种可能的方法是将值存储为哈希的哈希值:
var lookup = { 1.0: {10:.14, 20: .17, 30:.22}); etc. etc.
其中外部值是Foo值,每个Foo值映射到将Bar值映射到答案的对象.凌乱而难以阅读,但相当明确.
另一种方法是将值存储为数组数组,并从其他位置获取索引.也就是说,我将值存储在顶部:
var BarColumns = [10, 20, 30, 50, 50, 60];
并在旁边
var FooRows = [1.0, 1.1, 1.2, 1.3, 1.4, 1.5];
给定一些值时,我使用上面的列表将它们转换为索引,然后使用这些索引在包含答案的二维数组中查找:
var lookup = [
[.14, .17, .22, .29, .31, .45],
[.16, .18, .25. .32, .37, .51],
etc.
];
这与原始表格更紧密地对应,但没有标题,表格数据根本不是人类可读的,我认为这更难维护 – 特别是如果列更改.
另一个选项 – 超显式,在每个对象中重复范围:
var lookup = [{foo:1.0, bar:10, result:.14}, {foo:1.0, bar:20, result: .17}, etc.];
这是非常明确的,但可能是巨大的25 X 25值.
所以,我的问题是:什么是存储我的原始表的最佳方式,例如我可以将其用于查找,并且它具有人类可读性和可维护性?我上面的一个想法?或完全不同的东西?
我应该补充的重点:1)实际查找不会经常发生,因此我并不十分关注性能(在合理范围内),以及2)我从客户端获取表格数据作为Excel电子表格,但是最好的结果是,如果我可以将最终的javascript转换为客户端并让他们维护它 – 因此关注可读性.
解决方法:
我建议为这个过程创建一个数据结构.这将涉及一个LookUp“类”,它将调解一组DataPoint对象,这些对象将包含范围,条形和值.
数据结构
var Range = function(lower,upper){
this.lower = lower;
this.upper = upper;
};
var DataPoint = function(range,bar,value){
this.range = range;
this.bar = bar;
this.value = value;
};
var LookUp = function(){
this.DataPoints = [];
};
LookUp.prototype.add = function(data){
this.DataPoints.push(data);
};
LookUp.prototype.load = function(BarColumns,FooRows,ValueColumns){
ValueColumns = ValueColumns.split(" ").filter(Boolean);
for( var n = 0; n < FooRows.length; n++ ){
var range = 0;
for( var i = 0 ; i < BarColumns.length; i++ ){
var val = parseFloat(ValueColumns[(BarColumns.length * n) + i],10);
var point = new DataPoint(new Range(range,BarColumns[i]),FooRows[n],val);
this.add(point);
range = BarColumns[i];
}
}
};
LookUp.prototype.find = function(x,bar){
for(var i = 0; i < this.DataPoints.length; i++){
var point = this.DataPoints[i];
if( x > point.range.lower && x < point.range.upper && point.bar == bar){
return point.value;
}
}
};
样本数据
注意:valCols字符串只是网格的复制粘贴.但是,这可以很容易地从Excel中复制.在每一行的末尾都有一个串联,然后在concat列的底部,连接所有这些并且它将与此处显示的valCol相同.
var BarColumns = [10, 20, 30, 50, 50, 60];
var FooRows = [1.0, 1.1, 1.2, 1.3, 1.4, 1.5];
var valCols = ".14 .17 .22 .29 .31 .45 .16 .18 .25 .32 .37 .51 .19 .20 .29 .37 .41 .53 .21 .22 .32 .44 .49 .59 .25 .26 .34 .51 .52 .68 .29 .31 .39 .53 .54 .71";
建立
var lookup = new LookUp();
lookup.load(BarColumns,FooRows,valCols);
使用
console.log(lookup.find(24,1.3));//3.2
alert(lookup.find(24,1.3));//3.2
内容总结
以上是互联网集市为您收集整理的二维查找表 – 如何在javascript中存储标题全部内容,希望文章能够帮你解决二维查找表 – 如何在javascript中存储标题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。