Функция include () работает случайным образом при сравнении значений в массиве - PullRequest
0 голосов
/ 03 марта 2019

Я написал этот код JS вчера для школьного проекта, и все было хорошо (иш).Сайт показал ключ / значение, которое я хотел добавить к объекту.Хотя сегодня, когда я перезагрузил сервер и сайт, все значения были неопределенными или «маггловскими».Я обновлял страницу много раз, и иногда она работает, но в следующий раз она снова не определена.

Таким образом, код должен сделать что-то вроде этого:

1. Извлечь два файла JSON, одинэто список учеников, а другой - просто фамилии

2.Создать два массива из данных

3.Проверить фамилию каждого учащегося, если он в списке или нет

4. Решить, что студент чистый, наполовину или маггловский

5.Добавить значение к объекту студента

6.Показать на сайте

Я знаючто это как-то связано с порядком вызова функций, а что-то не так, когда я использую метод include () два, проверяющий имена.Но, к сожалению, я не мог узнать что.Вот код JS:

//LINKS
const link = "http://petlatkea.dk/2019/hogwarts/students.json";
const bloodLink = "http://petlatkea.dk/2019/hogwarts/families.json";

//ARRAYS
let allStudents = new Array();
let halfBloods = new Array();
let pureBloods = new Array();
window.addEventListener("DOMContentLoaded", init());

function init() {
  loadJSON();
}

function loadJSON() {
  fetch(link)
    .then(res => res.json())
    .then(jsonData => {
      prepareObjects(jsonData);
      showStudents();
    });
  fetch(bloodLink)
    .then(res => res.json())
    .then(jsonBloodData => {
      makeArrays(jsonBloodData);
    });
}

// CREATE STUDENT OBJECT WITH DATA
function prepareObjects(jsonData) {
  jsonData.forEach(jsonObject => {
    //create new object
    let student = Object.create(jsonObject);
    //split name into parts
    let nameParts = jsonObject.fullname.split(" ");
    //assign parts to the student object
    student.firstname = nameParts[0];
    student.lastname = nameParts[nameParts.length - 1];
    student.house = student.house;
    student.imageSource =
      student.lastname.toLowerCase() +
      "_" +
      student.firstname.slice(0, 1).toLowerCase() +
      ".png";
    student.id = uuidv4();
    student.fullname = student.fullname;
    allStudents.push(student);
  });
  setTimeout(function(){
     checkTheBlood();

     }, 300);
}


// CREATE BLOOD CLASS ARRAYS
function makeArrays(data) {

  for (let i = 0; i < data.half.length; i++) {
    halfBloods.push(data.half[i]);
  }
  for (let j = 0; j < data.pure.length; j++) {
    pureBloods.push(data.pure[j]);
  }

}
// CHECK FOR BLOODTYPE AND ADD KEYVALUE
function checkTheBlood() {
  allStudents.forEach(obj => {
    if (halfBloods.includes(obj.lastname)) {
      obj.bloodtype = "half";
    } else if (pureBloods.includes(obj.lastname)) {
      obj.bloodtype = "pure"
    } else {
      obj.bloodtype = "muggle"
    };
  })
}

Вот весь код: https://jsfiddle.net/bus5ef6p/1/

1 Ответ

0 голосов
/ 03 марта 2019

измените функцию loadJSON на

function loadJSON() {
  fetch(link)
    .then(res => res.json())
    .then(jsonData => {

      fetch(bloodLink)
      .then(res1 => res1.json())
      .then(jsonBloodData => {
        makeArrays(jsonBloodData);
        prepareObjects(jsonData);
        showStudents();
      });
    });
}

и удалите тайм-аут из функции prepareObjects.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...