javascript - 在 Javascript 中重新创建一个查找表

标签 javascript arrays

所以我有一个用于检索成员(member)费率的电子表格,列是年龄、持续时间和费率。您只需查看年龄列以找到客户的年龄,然后当您找到该年龄时,您继续向下移动以将其与正确的 Duration 相匹配,然后在最后一列中将是费率。一个(非常)小的版本可能看起来像这样;

Age,Duration,Rate
18,10,1.33
18,11,1.5
18,12,1.8
19,10,1.4
19,11,1.65
19,12,1.88
20,10,1.48
20,11,1.73
20,12,1.98

因此,19 岁、持续时间为 11 的人的患病率为 1.65。 20 岁且持续时间为 12 的人的比率为 1.98 - 很简单!

我的问题分为两部分,我想将其转换成一个网页,让某人输入年龄和持续时间以检索汇率。我很确定我的最佳选择是像这样的二维数组;

var array = [[18,10,1.33],[18,11,1.5],[18,12,1.8] .. and so on];

有没有更好的选择?

第二个问题是如何最好地遍历二维数组(如果这最终成为最佳解决方案)?正如我之前提到的,我需要能够进行一次迭代,该迭代根据两个条件搜索返回汇率。我相信这将由两部分迭代组成,但迭代对我来说是一个弱点,以至于试图掌握循环中放置我的迭代的位置只是大脑融化。我认为它看起来像这样;

for (var i = 0; i < array.length; i++){
for (var j = 0; j < array[i].length; j++){
    //Do something... I think something like this
    If array[][j] == ageImLookingFor && array[][j+1] == durationImLookingFor
    then return array[][j+2] (which is the rate)
  }
}

如有任何帮助、建议或想法,我将不胜感激

最佳答案

比使用数组更好的选择是使用一个对象(或 Map ),其属性(键)对应于年龄和持续时间的有效组合,通过该键有效地索引您的数据:

var list = {
     '18_10': { age: 18, duration: 10, rate: 1.33 }
     '18_11': { age: 18, duration: 11, rate: 1.5 },
     '18_12': { age: 18, duration: 11, rate: 1.8 },
     // .. and so on
};

这样你就不必遍历一个数组(参见你的问题#2),但是给定一个年龄和一个持续时间(假设在具有这些名称的变量中),你可以写这个来获得匹配的项目:

var item = list[age + '_' + duration];

当然,您应该检查 ageduration 是否为有效整数,并且 item 可以是 undefined 当组合未知时。

这是一个简单的片段(没有任何检查),您可以使用它来构建您的网络表单。它从具有数据的数组构建上述对象。

// Data in array -- will be keyed later
var arr = [
    { age: 18, duration: 10, rate: 1.33 },
    { age: 18, duration: 11, rate: 1.5 },
    { age: 18, duration: 12, rate: 1.8 },
    { age: 19, duration: 10, rate: 1.4 },
    { age: 19, duration: 11, rate: 1.65 },
    { age: 19, duration: 12, rate: 1.33 },
    { age: 20, duration: 10, rate: 1.48 },
    { age: 20, duration: 11, rate: 1.73 },
    { age: 20, duration: 12, rate: 1.98 },
];

// Build map, keyed by age/duration. It will look like:
//   { 
//      '18_10': { age: 18, duration: 10, rate: 1.33 },
//      '18_11': { age: 18, duration: 11, rate: 1.33 },
//       ...etc
//   }
mapByAgeDuration = {};
for (var i=0; i < arr.length; i++) {
    mapByAgeDuration[arr[i].age + '_' + arr[i].duration] = arr[i];
}

// Fast retrieval function:
function getItemFor(age, duration) {
    return mapByAgeDuration[age + '_' + duration];
}

// I/O

var button = document.getElementById('findRate');
var inputAge = document.getElementById('age');
var inputDuration = document.getElementById('duration');
var outputRate = document.getElementById('rate');

button.onclick = function() {
    var age = inputAge.value;
    var duration = inputDuration.value;
    
    // Retrieve item for this age and duration
    var item = getItemFor(age, duration);

    // Output rate
    outputRate.textContent = item !== undefined ? item.rate 
                             : 'not a valid combination';
}
Age (18 - 20): <input id="age"><br>
Duration (10 - 12): <input id="duration"><br>
<button id="findRate">Find Rate</button><br>
Rate: <span id="rate"></span><br>

关于javascript - 在 Javascript 中重新创建一个查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36718344/

相关文章:

Java 将字符串数组转换为列表

java - 如何在java中解码数组中的十六进制代码

C 内存映射结构数组泄漏

java - 空数组到空列表

javascript - 绑定(bind)元素时添加范围对象的格式

javascript - 如何在 Handlebars 中设置 (!)?

javascript - JQuery 高亮插件,参数不知何故未定义

javascript - 使用 `function.caller`

javascript - 在 JSON 对象上使用 stringify 以在 HTML 数据属性中使用

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP