@ForSureN1
frontend dev

Почему происходит неправильный вывод двумерного массива?

Добрый день. Имеется двумерный массив с городами, при открытии страницы запрашивается город, далее выводится соответствующая страна для этого города, проблема в том, что при добавлении условия ELSE, он берет только 1 элементы из массивов, в случае если ввести город по индексу > 0, то будет писать что такого города не найдено.
let array = [[],[],[],[]]
array[0][0] = 'Астана'
array[0][1] = 'Караганда'
array[0][2] = 'Актобе'
array[0][3] = 'Алмата'
array[1][0] = 'Москва'
array[1][1] = 'Новосибирск'
array[1][2] = 'Сочи'
array[1][3] = 'Омск'
array[2][0] = 'Пекин'
array[2][1] = 'Шанхай'
array[2][2] = 'Сиань'
array[2][3] = 'Харбин'
array[3][0] = 'Нью-йорк'
array[3][1] = 'Чикаго'
array[3][2] = 'Вашингтон'
array[3][3] = 'Даллас'
let city = prompt('Введите название города:', '')
console.log(city)
outer: for (let i in array) {
	console.log(array[i])
	for(let j in array[i]) {
		console.log(array[i][j])
		if(city === array[0][j]) {
			alert('Казахстан')
			break outer;
		} else if (city === array[1][j]) {
			alert('Россия')
			break outer;
		} else if (city === array[2][j]) {
			alert('Китай')
			break outer;
		} else if (city === array[3][j]) {
			alert('США')
			break outer;
		} else {
			alert('Такого города не найдено')
			break outer;
		}
	}
}
  • Вопрос задан
  • 174 просмотра
Решения вопроса 2
nowm
@nowm
function cityToCountry(city) {
    const countries = ['Казахстан', 'Россия', 'Китай', 'США'];

    let cities = [[],[],[],[]]
    array[0][0] = 'Астана';
    array[0][1] = 'Караганда';
    array[0][2] = 'Актобе';
    array[0][3] = 'Алмата';
    array[1][0] = 'Москва';
    array[1][1] = 'Новосибирск';
    array[1][2] = 'Сочи';
    array[1][3] = 'Омск';
    array[2][0] = 'Пекин';
    array[2][1] = 'Шанхай';
    array[2][2] = 'Сиань';
    array[2][3] = 'Харбин';
    array[3][0] = 'Нью-йорк';
    array[3][1] = 'Чикаго';
    array[3][2] = 'Вашингтон';
    array[3][3] = 'Даллас';

    for (let i in cities) {
        if (!cities.hasOwnProperty(i)) {
            continue;
        }

        for (let j in cities[i]) {
            if (!cities[i].hasOwnProperty(j)) {
                continue;
            }

            if (cities[i][j] === city && countries[i]) {
                return countries[i];
            }
        }
    }

    return 'Город не найден';
}

let city = prompt('Введите название города:', '');

alert(cityToCountry(city));


Я где-то прочитал ваш комментарий о том, что вам обязательно нужно использовать массивы и конкретно в таком виде, как вы их описали. На эту тему могу сказать, что вам, возможно кто-то навязывает методы решения задачи, которые изначально заставляют вас ходить кругами и писать долбанутый код. Либо вы самостоятельно хотите нарезать круги вместо того, чтобы кратчайшим способом прийти к решению.

Самый короткий путь для решения такой задачи:

const cityToCountry = {
    'Астана': 'Казахстан',
    'Караганда': 'Казахстан',
    'Актобе': 'Казахстан',
    'Алмата': 'Казахстан',
    'Москва': 'Россия',
    'Новосибирск': 'Россия',
    'Сочи': 'Россия',
    'Омск': 'Россия',
    'Пекин': 'Китай',
    'Шанхай': 'Китай',
    'Сиань': 'Китай',
    'Харбин': 'Китай',
    'Нью-йорк': 'США',
    'Чикаго': 'США',
    'Вашингтон': 'США',
    'Даллас': 'США',
};

const city = prompt('Введите название города:', '');
if (!cityToCountry.hasOwnProperty(city)) {
    alert('Такого города не найдено');
} else {
    alert(`Для города «${city}» найдена страна «${cityToCountry[city]}»`);
}


Этот код работает быстрее, и подход, который в нём используется, уменьшает количество точек отказа. Если вы всегда будете стремиться идти к цели прямыми путями, а не нарезать круги, вы лучше состоитесь, как программист. Но это дело ваше.
Ответ написан
Во-первых, вы в else через break outer; прерываете выполнения цикла, и у вас отрабатывает только элемент array[0][0].
Во-вторых, что вы здесь let j in i собрались перебирать?
Надо вот так:
outer: for (let i in array) {
  console.log(array[i])
  for(let j in array[i]) {
    console.log(array[i][j])
    if(city === array[0][j]) {
      alert('Казахстан')
      break outer;
    } else if (city === array[1][j]) {
      alert('Россия')
      break outer;
    } else if (city === array[2][j]) {
      alert('Китай')
      break outer;
    } else if (city === array[3][j]) {
      alert('США')
      break outer;
    } else {
      alert('Такого города не найдено')
    }
  }
}


Да и alert('Такого города не найдено') не обязательно вызывать при каждом проходе. Можно сделать так:
var gotCity = false

outer: for (let i in array) {
  console.log(array[i])
  for(let j in array[i]) {
    console.log(array[i][j])
    if(city === array[0][j]) {
	  gotCity = city
      alert('Казахстан')
      break outer;
    } else if (city === array[1][j]) {
      alert('Россия')
      gotCity = city
      break outer;
    } else if (city === array[2][j]) {
      alert('Китай')
      gotCity = city
      break outer;
    } else if (city === array[3][j]) {
      alert('США')
	  gotCity = city
      break outer;
    }
  }
}

if (gotCity === false) {
	alert('Такого города не найдено');
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
cannibal_corpse
@cannibal_corpse
Верстальщик руками
const countries = [
  {id: 1, name: 'Екатеринбург'},
  {id: 2, name: 'Москва'}
];

let answer = prompt('Введите название города'); 
let city = '';

for (let i = 0; i < countries.length; i++) {
  if (countries[i].name === answer) {
    city = answer;
  } 
}

city === answer ? alert(`Город: ${city}`) : alert('Город не найден');
Ответ написан
@semenoviv
Можно так:

let country = false;
let array = [[],[],[],[]]

array[0][0] = 'Астана'
array[0][1] = 'Караганда'
array[0][2] = 'Актобе'
array[0][3] = 'Алмата'
array[1][0] = 'Москва'
array[1][1] = 'Новосибирск'
array[1][2] = 'Сочи'
array[1][3] = 'Омск'
array[2][0] = 'Пекин'
array[2][1] = 'Шанхай'
array[2][2] = 'Сиань'
array[2][3] = 'Харбин'
array[3][0] = 'Нью-йорк'
array[3][1] = 'Чикаго'
array[3][2] = 'Вашингтон'
array[3][3] = 'Даллас'

let city = prompt('Введите название города:', '')

outer: for (let i = 0; i < array.length; i++) {
    for (let j = 0; j < array[i].length; j++) {
        if (city === array[i][j]) {
            if (i === 0) {
                country = true;
                alert('Казахстан')
            } else if (i === 1) {
                country = true;
                alert('Россия')
            } else if (i === 2) {
                country = true;
                alert('Китай')
            } else if (i === 3) {
                country = true;
                alert('США')
            }
        }
    }
}

if (country === false) {
    alert('Такого города не найдено')
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
24 нояб. 2024, в 23:07
2000 руб./за проект
24 нояб. 2024, в 21:55
200000 руб./за проект