我的问题在于javaScript我想要一个城市列表,每个城市与一系列温度相关联,如曼彻斯特10-20,伦敦21-30。当用户输入温度时,它会告知相关城市(用户输入的22伦敦将被输出)。
我最初的想法是拥有一个城市的String数组,然后将用户输入映射到城市的索引。因此,用户输入22将其映射到索引2(伦敦)。
但稍后输入一个城市将非常困难。
我的第二个想法只是从最低频段开始的if else语句。
这是我的两个想法,我想知道解决这个问题的最佳方法是什么。
答案 0 :(得分:1)
制作3维
array [City][low-temp][high-temp]
如果用户提供输入,则运行所有城市并比较输入是否为
low-temp < input < high-temp
并返回符合条件的城市列表。
答案 1 :(得分:0)
不要为此使用数组。假设城市名称是唯一的(如果它们不是那么你需要找到一种通过州/省/其他分层标识符使它们成为唯一的方法)
var cityToTempRange = {
<city name>: {
low: <low temp>
, high: <high temp>
}
, <city name>: ...
};
这可以更好地表示您的数据,并且无需迭代您的数组来查找您正在寻找的城市。
要查找城市名称列表,最好使用实用程序库,例如lodash
function getCitiesFromTemp(requestedTemp) {
return _(cityToTempRange)
.pickBy(cityHasTemp)
.keys()
.value();
function cityHasTemp(rangeObj) {
return rangeObj.low <= requestedTemp
&& rangeObj.high >= requestedTemp;
}
}
,通过以下测试
var cityToTempRange = {
Manchester: {
low: 10
, high: 20
}
, London: {
low: 21
, high: 30
}
};
console.log(getCitiesFromTemp(21));
打印['London']
答案 2 :(得分:0)
另一种方法。
如果没有重叠且温度范围之间的差异为10.那么只需创建一个城市数组并按照低温进行排序。
当用户输入一个值时,将其除以10,得到该数组中该指数的城市/城市。
数组看起来像
myCitiesArray = [
{
cities: chicago, new york
low-temp: 11,
high-temp: 20
},
{
cities: xyz
low-temp: 21,
high-temp: 30
},
.
.
]
index = Math.floor(UserInput/10);
如果您还有负温度范围,请使用此选项
index = ~~(userInput / 10);
您需要检查边框值。因此,如果没有余数,则index = index - 1;
index = userInput % 10 === 0 ? index-1 : index;
答案 3 :(得分:0)
您可以使用包含对象的数组并迭代城市的数据。
我建议允许重叠温度,因为现实反映了这一点。
function getCities(temperature) {
return data.
filter(function (a) {
return temperature >= a.min && temperature <= a.max;
}).
map(function (a) {
return a.city;
});
}
var data = [
{ city: 'Manchester', min: 10, max: 20 },
{ city: 'London', min: 21, max: 30 }
];
console.log(getCities(22));
console.log(getCities(10));
&#13;