2015-08-28 50 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

大多数人认为它很平凡,但如果您使用的关键字多于需要,那么您会导致程序执行额外的工作。并且完成任务所需的工作量比完成任务所需的工作量更高。有些人会考虑这种微型优化,但我会不同意。没有任何东西可以通过不写代码来提高效率,在这种情况下,我相信效率,不管多小,都应该是首选。请注意,你也可以输入较少的内容来输入它,这可以显着提高你自己的效率 –