2015-08-28 53 views
1

前幾天我得到了這個問題,令人驚訝的是它爲我的邏輯思維創造了很多問題。如何將多個數組中給出的輸入分組,如[key1,「value1」,key2,「value2」,...]?

我們有三個簡單的數組:

var countries = [1, "DK", 2, "USA", 3, "Sweden"]; 
var languages = [2, "English", 1, "Danish", 3, "Swedish"]; 
var population = [3, 8000000, 1, 6000000, 2, 3000000000]; 

輸出應該是什麼樣子的控制檯日誌是這樣的:

// In USA people speak English and there live 300000000 people 
// In DK people speak Danish and there live 6000000 people 
// In Sweden people speak Swedish and there live 8000000 people 

現在有人告訴我,它可以用一個for循環來解決,但我陷入瞭如何獲得數字的位置,然後保存這些數字,所以我可以從其他兩個數組中選擇它們。

它必須是動態的,所以如果我添加更多元素到數組中,它會自動生成像上面提到的三個句子。

這是我從老師那裏得到的,所以輸入數組必須保持那樣。每個數字在升序後都有一個字符串,這就是我們必須弄清楚的模式,所以它看起來像我上面評論過的文字。

+5

作爲第一步,我會改變的數據結構... – Sirko

+0

@Sirko我想,OP不能 – Hacketo

+2

@Hacketo那麼這應該是「算法」 – Sirko

回答

0

你肯定需要使用多個循環。

除非你想改變你的數據(見喬治回答)的結構,這樣的事情應該工作:

for (var i = 0; i < countries.length; i+=2) { 
    var countryId = countries[i]; 
    var countryName = countries[i+1]; 
    var countryLanguage, countryPopulation; 
    for (var j = 0; j < languages.length; j+=2) { 
    if (languages[j] == countryId) countryLanguage = languages[j+1]; 
    } 
    for (var j = 0; j < population.length; j+=2) { 
    if (population[j] == countryId) countryPopulation = population[j+1]; 
    } 
    console.log("In " + countryName + " people speak " + 
       countryLanguage + " and there live " + 
       countryPopulation + " people"); 
} 
2

你的問題是奇怪的數據結構。它轉換爲東西可以一起工作:

var countries = [1, "DK", 2, "USA", 3, "Sweden"]; 
 
var languages = [2, "English", 1, "Danish", 3, "Swedish"]; 
 
var population = [3, 8000000, 1, 6000000, 2, 3000000000]; 
 

 
var data = {}; 
 

 
function addArray(key, ary) { 
 
    
 
    for (var i = 0; i < ary.length; i += 2) { 
 
    var j = ary[i]; 
 
    data[j] = data[j] || {}; 
 
    data[j][key] = ary[i + 1]; 
 
    } 
 
} 
 

 
addArray('country', countries); 
 
addArray('language', languages); 
 
addArray('population', population); 
 

 
document.write("<pre>" + JSON.stringify(data,0,3)); 
 

這應該是顯而易見如何從這個對象的輸出。

+0

看起來不錯,但爲什麼在'addArray()'函數內硬編碼變量名'data'?將其作爲參數,並且該功能可以重複使用。此外,只是個人風格的偏好,但我更喜歡'如果(!data [j])data [j] = {}'over'data [j] = data [j] || {}'(因爲,唉,JS不會讓我只寫'data [j] || = {}')。當我們處理它時,如何將變量'j'重命名爲稍微更有意義的東西,比如'group'?也許可以同時將這兩個值從數組中拉出來,如'var group = ary [i],value = ary [i + 1]',這樣我們就可以編寫data [group] [key] = value '以後? –

+0

@IlmariKaronen:謝謝,這裏肯定有改進的空間,但由於OP似乎並不在意,現在就讓我們離開它吧。 – georg

-1

與二維數組變化的邏輯就像

var array = [["DK","English","8000000"],["USA","Danish","6000000"],["Sweden","Swedish","2000000"]]; 

從,你可以很容易地找到你的價值。

-1
console.log("In USA people speak " + languages[(languages.indexOf(countries[countries.indexOf("USA")-1]) 
+ 1)] + " and there live " + 
population[(population.indexOf(countries[countries.indexOf("USA")-1])+ 1)] + " people"); 

注意:這是一個不需要操作數據的解決方案! 這適用於第一個,其他人將是相同的。不知道是否有更好的方法,但這是我的第一本能......

1

雖然IE8及以下不支持Array.indexOf,你可以試試:

var countries = [1, "DK", 2, "USA", 3, "Sweden"]; 
var languages = [2, "English", 1, "Danish", 3, "Swedish"]; 
var population = [3, 8000000, 1, 6000000, 2, 3000000000]; 

var size = countries.length/2; 

for (var i = 1; i <= size; i++) 
{ 
    var country = countries[countries.indexOf(i) + 1]; 
    var lang = languages[languages.indexOf(i) + 1]; 
    var pop = population[population.indexOf(i) + 1]; 

    console.log("In " + country + " people speak " + lang + " and there live " + pop + " people"); 
} 
+0

該解決方案僅使用指定的循環。我唯一需要改變的是我只會在循環之外聲明country,lang和pop來使用var關鍵字,使其更加高效。 –

+0

只是好奇,爲什麼它會更有效率? – King

+0

大多數人認爲它很平凡,但如果您使用的關鍵字多於需要,那麼您會導致程序執行額外的工作。並且完成任務所需的工作量比完成任務所需的工作量更高。有些人會考慮這種微型優化,但我會不同意。沒有任何東西可以通過不寫代碼來提高效率,在這種情況下,我相信效率,不管多小,都應該是首選。請注意,你也可以輸入較少的內容來輸入它,這可以顯着提高你自己的效率 –