Попытка перебора двух коллекций

#javascript #arrays #loops #iteration

Вопрос:

Я пытаюсь создать фрагмент кода, содержащий 2 массива, один с названиями фруктов, другой с человеческими именами, при запуске я хочу, чтобы он проходил через каждый фрукт и каждое имя, например: «Привет, меня зовут x, и мне нравится фрукт x».

Когда я впервые написал код, я мог заставить его произнести одно имя, но без фруктов, и у меня не было i приращения, поэтому он не проходил через набор имен, только первое значение. Это код до сих пор

 var fruitNames = ["Banana","Apple","Watermelon","Kiwi Fruit"]; 
var peopleNames = ["Nathan","Allie","Chris","Charlie"];

var i =0;

while (i < fruitNames.length < peopleNames.length) {
    
    alert("Hello my name is ") (peopleNames[0]) ("and I like the fruit ") (fruitNames[0]);
    i  

}
 

Комментарии:

1. i является индексом массива, поэтому вам нужно использовать его при выборе массива: peopleNames[i] и fruitNames[i] . И просто используйте длину одного массива в вашем состоянии i < fruitNames.length .

2. В общем, вы должны убедиться, что длины массивов равны. Но вы можете проверить две длины с помощью логического оператора и: (i < fruitNames.length amp;amp; i < peopleNames.length) , а затем использовать i в качестве индекса вместо 0 .

Ответ №1:

Вот один из способов. Вы действительно заботитесь только о количестве людей, пока есть достаточно фруктов.

 let fruitNames = ["Banana", "Apple", "Watermelon", "Kiwi Fruit"];
let peopleNames = ["Nathan", "Allie", "Chris", "Charlie"];


peopleNames.forEach((people, index) => {
  if (!fruitNames[index]) return;
  alert(`Hello my name is ${people} and I like ${fruitNames[index]}`);

}); 

Ответ №2:

Другое решение-использовать for-loop как:

 var fruitNames = ["Banana", "Apple", "Watermelon", "Kiwi Fruit"];
var peopleNames = ["Nathan", "Allie", "Chris", "Charlie"];

for (let i = 0; i < fruitNames.length; i  ) {
    console.log('Hello my name is '   peopleNames[i]   ' and i like the fruit '   fruitNames[i]);
} 

Или forEach как:

 var fruitNames = ["Banana", "Apple", "Watermelon", "Kiwi Fruit"];
var peopleNames = ["Nathan", "Allie", "Chris", "Charlie"];

peopleNames.forEach((value,index) =>{
  console.log('Hello my name is '   value   ' and i like the fruit '   fruitNames[index]);
}); 

Ответ №3:

Три проблемы с вашим кодом.

Во-первых, alert отображается только то, что указано в скобках, поэтому создайте переменную для хранения сообщения, которое вы хотите сохранить, а затем поместите все сообщение в скобки.

Во-вторых, чтобы отобразить определенное значение в массиве, поместите индекс i в квадратные скобки.

 while(cond){
  var msg = 'Hello my name is '   peopleNames[i]   ' and I like the fruit '   fruitNames[i];
  alert(msg);
  i  ;
}
 

В-третьих, я не знаю, чего вы пытаетесь достичь с помощью этого условия (i < fruitNames.length < peopleNames.length) , но это недопустимый javascript. Если вы хотите перейти к тому, что длиннее , ваше условие может быть while(i < Math.max(fruitNames.length, peopleNames.length)) таким, это даст undefined результат при попытке получить доступ к несуществующим значениям в более коротком массиве. Если вы хотите перейти к тому, что короче , ваше условие может быть while(i < Math.min(fruitNames.length, peopleNames.length)) , это не покажет некоторые значения в более длинном массиве.

С учетом этих изменений ваш код будет выглядеть следующим образом:

 var fruitNames = ["Banana","Apple","Watermelon","Kiwi Fruit"]; 
var peopleNames = ["Nathan","Allie","Chris","Charlie"];

var i = 0;
while (i < Math.min(fruitNames.length, peopleNames.length)) {
  var msg = 'Hello my name is '   peopleNames[i]   ' and I like the fruit '   fruitNames[i];
  alert(msg);
  i  ;
}
 

Ответ №4:

Вот очень короткая версия. Он выполняет обратный отсчет длины массива, что означает, что мы запускаем массивы в .reverse()

 let f = ["Banana", "Apple", "Watermelon", "Kiwi Fruit"].reverse(), p = ["Nathan", "Allie", "Chris", "Charlie"].reverse(), pl = p.length
while (pl-- > 0) console.log(`Hello my name is ${p[pl]} and I like ${f[pl]}`);

// OR change `console.log` --> `alert`