Массивы не сортируются с сортировкой ();что я получаю из запроса Get от json, который является json.parsed Javascript - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь получить данные из API, который отправляет json. Мне удалось получить данные и все их поместить в 1 массив, но проблема в том, что когда я сортирую массив, а затем console.log, он все еще является случайным по какой-то причине илииногда он даже не извлекал все данные из API, поэтому я не получаю все данные в журнале при сортировке.(это все еще случайно)

script.js

"use strict";

const dataLinks = [
  "https://api.data.amsterdam.nl/bbga/cijfers/",
  "https://api.data.amsterdam.nl/bbga/gebieden/",
  "https://api.data.amsterdam.nl/bbga/groepen/",
  "https://api.data.amsterdam.nl/bbga/meta/",
  "https://api.data.amsterdam.nl/bbga/themas/",
  "https://api.data.amsterdam.nl/bbga/variabelen/"
];

const allDataInArray = [];
let ResetNumber = 0;

init();

//Go thruw all links
function init() {
  for (ResetNumber = 0; ResetNumber < dataLinks.length; ResetNumber++) {
    GetAllData(dataLinks[ResetNumber]);
  }
  makeArrays();
}

//Open the links in a get GET request
//then make from the json an Array
//push all into 1 array
function GetAllData(hrefLink) {
  let xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      let myObj = JSON.parse(this.responseText);
      // console.log(myObj)
      allDataInArray.push(myObj);
    }
  };
  xmlhttp.open("GET", hrefLink, true);
  xmlhttp.send();
}

function makeArrays() {
  allDataInArray.sort();
  console.log(allDataInArray);

}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

У вас есть две проблемы здесь.

Первая из них заключается в том, что ваши возвращаемые значения равны Object с, и вам придется определить пользовательскую функцию сортировки для передачи на Array.sort, чтобы получить правильное значение.отсортированный результат.

Другая проблема заключается в том, что вам нужно дождаться завершения всех запросов, прежде чем сортировать массив результатов.Стандартный способ сделать это - использовать Promise.all и fetch (который заключает запрос в Promise).

Вы можете использовать следующий код в качестве шаблона и заполнить определение sortFunction, чтобы заставить его работать в целом.

const dataLinks = [
    "https://api.data.amsterdam.nl/bbga/cijfers/",
    "https://api.data.amsterdam.nl/bbga/gebieden/",
    "https://api.data.amsterdam.nl/bbga/groepen/",
    "https://api.data.amsterdam.nl/bbga/meta/",
    "https://api.data.amsterdam.nl/bbga/themas/",
    "https://api.data.amsterdam.nl/bbga/variabelen/"
];

let allDataInArray;

Promise.all(dataLinks.map(link => fetch(link).then(response => { if (response.ok) { return response.json(); }})))
.then(result => { allDataInArray = result.sort(sortFunction); })

Обратите внимание, что любой код, который хочет использовать allDataInArray, также должен ждать.Для этого вы можете реализовать шаблон наблюдатель .

0 голосов
/ 25 февраля 2019

По умолчанию метод sort () сортирует значения в виде строк в алфавитном порядке и в порядке возрастания.если вы хотите отсортировать массив для объекта или числа, используйте его с функцией сравнения array.sort(compareFunction)

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