所以我有一个用于检索成员(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];
当然,您应该检查 age 和 duration 是否为有效整数,并且 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/