@Evgenij_nechujveter

Почему не работает такой код js?

Есть задача:
Надо сделать так, чтобы у пользователя циклически спрашивалось хочет ли он ввести еще пользователей.
И пользователя сохранялись в массив объектов.
Если пользователь выбирает ввести нового, то в вызывается функция заполнения
Если пользователь выбирает отмена, то весь массив генерится в таблицу и отображается

Подскажите, почему не работает так?

var persons = [];
    var person = {
        name: '',
        sname: '',
        age: ''
    };
    function ask() {
        person.name = prompt("Введите свое имя:");
        person.sname = prompt("Введите свою фамилию:");
        person.age = prompt("Введите свой возраст:");
        persons.push(person);
        ask1();
    }
    function ask1(){
        var a = prompt("Ввести еще одного пользователя?", "");
        if (a!=null){
        ask();}
        else (test());


    }
    var res;
    function test(persons) {
        res = persons.join("<br/>");
        document.write("<p>" + res);
    }

    function say(person) {
        document.write("Имя: " + person.name + "<br/>");
        document.write("Фамилия: " + person.sname + "<br/>");
        document.write("Возраст: " + person.age + "<br/>");
        document.write("");
        }
    ask();
    say();
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
@Cr2ed
Разберем по порядку
function ask1(){
var a = prompt("Ввести еще одного пользователя?", "");
  if (a!=null){
        ask();}
        else (test());
    }


Тут лучше использовать confirm. Также тут не правильно используется else. Будет выглядеть так:
function ask1(){
      if (confirm("Ввести еще одного пользователя?")) {
        ask();
      } else {
        test()
      }
}


Вторая ошибка в объявлении метода test
function test(persons) {
        res = persons.join("<br/>");
        document.write("<p>" + res);
}


Вы почему то на вход принимаете массив, но не передаете его в месте вызова. И этот параметр можно опустить.
Метод say. Вы на вход ожидаете параметр person, нов месте вызова его не передаете.
Так же у вас одна и таже ссылка на person. Т.е. не вводишь нового а меняешь старого и добавляешь его еще раз в массив.

Весь код будет выглядеть так:
var persons = [];

    function ask() {
      var person = {}
      
      person.name = prompt("Введите свое имя:");
      person.sname = prompt("Введите свою фамилию:");
      person.age = prompt("Введите свой возраст:");
      
      persons.push(person);
      
      ask1();
    }
    function ask1(){
      if (confirm("Ввести еще одного пользователя?")) {
        ask();
      } else {
        test()
      }
    }

    function test() {
        persons.forEach(person =>  { say(person); document.write("<p></p>");})
    }

    function say(person) {
      document.write("Имя: " + person.name + "<br/>");
      document.write("Фамилия: " + person.sname + "<br/>");
      document.write("Возраст: " + person.age + "<br/>");
      document.write("");
    }
    ask();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@toly19
Чего-то ты напутал с кодом.
let persons = [];
	/*var person = {
		name: '',
		sname: '',
		age: ''
	};*/
	function ask() {
		let person = {};
		person.name = prompt("Введите свое имя:");
		person.sname = prompt("Введите свою фамилию:");
		person.age = prompt("Введите свой возраст:");
		persons.push(person);
		ask1();
	}
	function ask1() {
		let a = prompt("Ввести еще одного пользователя?", "");
		if (a != null) {
			ask();
		}
		else {
			test();
			//либо persons.forEach(say);
		};
	}
	let res;
	function test() {
		res = persons.map((persona, n) => `persona №${n}- name: ${persona.name}; sname: ${persona.sname}; age: ${persona.age}`).join("<br />");
		document.write("<p>" + res+"</p>");
	}

	function say(person, personNum) {
		document.write("Номер: " + personNum + "<br/>");
		document.write("Имя: " + person.name + "<br/>");
		document.write("Фамилия: " + person.sname + "<br/>");
		document.write("Возраст: " + person.age + "<br/>");
		document.write("\n");
	}
	ask();
	//say();
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы