2015-08-28 2 views
1

J'ai eu ce problème il y a quelques jours et, étonnamment, cela a créé beaucoup de problèmes pour ma logique.Comment grouper des entrées données dans plusieurs tableaux qui ressemblent à [key1, "value1", key2, "value2", ...]?

Nous avons trois tableaux simples:

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

Qu'est-ce que la sortie devrait ressembler dans le journal de la console est la suivante:

// 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 

Maintenant, on m'a dit qu'il peut être résolu avec une boucle, mais Je suis coincé sur la façon d'obtenir la position des numéros et ensuite enregistrer ces numéros afin que je puisse les sélectionner dans les deux autres tableaux.

Il doit être dynamique, de sorte que si j'ajouter des éléments au tableau, il fait automatiquement des phrases comme les trois je l'ai mentionné ci-dessus.

Il est comment je l'ai obtenu de l'enseignant, de sorte que le tableau d'entrée doit rester comme ça. Chaque nombre a une chaîne après dans l'ordre croissant, et c'est le modèle que nous devons comprendre afin qu'il ressemble au texte que j'ai commenté ci-dessus.

+5

Dans un premier temps, je changerais ... – Sirko

+0

la structure de données @Sirko je suppose que, OP ne peut pas – Hacketo

+2

@Hacketo cela devrait être la première étape de ce « algorithme » – Sirko

Répondre

0

Vous devez certainement utiliser plus d'une boucle.

Sauf si vous voulez changer la structure de vos données (voir réponse par Georg), quelque chose comme cela devrait fonctionner:

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

Votre problème est la structure de données impair. Le convertir en quelque chose que vous pouvez travailler avec:

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

Il devrait être évident comment obtenir votre sortie de cet objet.

+0

Ça a l'air sympa, mais pourquoi coder en dur le nom de la variable 'data' dans la fonction' addArray() '? Faites-en un paramètre et la fonction devient réutilisable. Aussi, juste une préférence de style personnel, mais je préférerais si (! Data [j]) data [j] = {} 'sur' data [j] = data [j] || {} '(puisque, hélas, JS ne me laisse pas écrire juste' data [j] || = {} '). Et pendant que nous y sommes, que diriez-vous de renommer la variable 'j' pour quelque chose d'un peu plus significatif, comme' group'? Et peut-être extraire les deux valeurs du tableau en même temps, comme dans 'var group = ary [i], value = ary [i + 1]', de sorte que nous puissions écrire 'data [groupe] [clé] = valeur Plus tard? –

+0

@IlmariKaronen: merci, il y a sûrement place à amélioration, mais comme le PO ne semble pas s'en soucier, laissons-le tel quel pour l'instant. – georg

-1

Modifier la logique avec tableau 2D comme

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

A partir de ce que vous pouvez facilement trouver votre valeur.

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

Remarque: Ceci est une solution sans manipulation préalable des données! Cela fonctionne pour le premier, les autres seront les mêmes. Je ne sais pas s'il y a une meilleure approche, mais ce fut mon premier instinct ...

1

Bien que IE8 et ci-dessous ne prennent pas en charge Array.indexOf, vous pouvez essayer:

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

Cette solution utilise uniquement une boucle comme spécifié. La seule chose que je changerais, c'est que j'utiliserais le mot clé var une seule fois en déclarant country, lang et pop en dehors de la boucle avec la taille pour le rendre plus efficace. –

+0

Juste curieux, pourquoi serait-il plus efficace? – King

+0

la plupart considèrent comme trivial, mais si vous utilisez un mot-clé plus que nécessaire, vous obligez le programme à faire un travail supplémentaire. Et faire plus de travail que nécessaire pour accomplir une tâche n'est pas efficace. Certains envisageraient cette micro-optimisation, mais je ne suis pas d'accord. Rien n'est gagné en n'écrivant pas le code pour être plus efficace et dans de tels cas, je crois que l'efficacité, aussi petite soit-elle, devrait être préférée. Notez aussi que vous taperez moins pour l'entrer, ce qui représente une augmentation mesurable de votre propre efficacité –