2017-03-06 87 views
1

我的問題是在javaScript中我想要一個城市的列表,每個城市都與一系列溫度相關聯,如曼徹斯特10-20,倫敦21-30。當用戶輸入溫度時,它會告訴相關的城市(將輸出用戶輸入的22倫敦)。將JavaScript映射到字符串

我最初的想法是有一個城市的String數組,然後將用戶輸入映射到城市的索引。因此,用戶輸入22將其映射到索引2(倫敦)。

但是以後輸入城市確實很難。

我的第二個想法是隻有一噸,如果其他語句從最低頻帶開始。

這些是我的兩個想法,我想知道什麼是解決這個問題的最好方法。

+0

我是否正確理解這兩個城市將永遠不會重疊*溫度*範圍是多少? – domsson

+0

瞭解['Array.prototype.filter'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) – Bwaxxlo

+0

@domdom yeah沒有重疊 –

回答

1

做一個3維

array [City][low-temp][high-temp] 

如果用戶輸入提供了運行所有城市和比較,如果輸入的是

low-temp < input < high-temp 

,並返回符合條件的城市名單。

+0

我不知道如果一個3D陣列是最好的方法,溫度不一定會從0開始,他們甚至可能會低於0 –

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']

+1

因此,給定溫度,他會發現/訪問正確的城市? - 好吧,你的編輯現在顯示如何。 :) – domsson

+0

我編輯答案,添加該部分 – aaaaaa

+1

歡呼的人這是我正在尋找 –

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; 
+0

我在想同樣的事情。但從OP的例子來看,溫度範圍並不總是相同的(曼徹斯特爲11,倫敦爲10)。但如果是的話,這將是我相信的最優雅的方式。 – domsson

+0

是的,你是對的。 – Ankit

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));

+0

謝謝你做了一些研究後,這似乎是最好的方法。 –