首页 > 解决方案 > 数组不是用 sort() 排序的;我摆脱了来自 json.parsed Javascript 的 json 的 Get 请求

问题描述

我试图从发送 json 的 API 获取数据我成功检索数据并将其全部推送到 1 个数组中,但问题是当我对数组进行排序时,console.log由于某种原因它仍然是随机的,有时甚至没有从 API 中提取所有数据,因此在排序时我不会在日志中获取所有数据。(这仍然是随机的)

脚本.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);

}

标签: javascriptjsonajax

解决方案


你这里有两个问题。

第一个是您的返回值是Objects 并且您必须定义一个自定义排序函数以传递给以Array.sort获得正确排序的结果。

另一个问题是您必须等待所有请求完成后才能对结果数组进行排序。执行此操作的标准方法是使用Promise.alland fetch(将请求包装到 a 中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也必须等待。您可以为此实现观察者模式。


推荐阅读