数组不是排序 whit sort(); 我从 json 的 Get 请求中得到的,即 json.parsed Javas



我试图从发送 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);
}

默认情况下,sort() 方法按字母顺序和升序将值排序为字符串。 如果要对对象或数字的数组进行排序,请将其与比较功能一起使用array.sort(compareFunction)

你这里有两个问题。

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

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

最新更新