javascript - 数组不是用 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);
}
解决方案
你这里有两个问题。
第一个是您的返回值是Object
s 并且您必须定义一个自定义排序函数以传递给以Array.sort
获得正确排序的结果。
另一个问题是您必须等待所有请求完成后才能对结果数组进行排序。执行此操作的标准方法是使用Promise.all
and 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
也必须等待。您可以为此实现观察者模式。
推荐阅读
- webpack - 在使用 FastAPI 服务并通过 Jinja 模板传递的 Google Chrome 中使用 vue-cli(和 webpack / babel)加载缩小的 javascript 构建时出错
- php - 根据 WooCommerce 购物车小计自动添加可变数量的特定产品
- python - 使用 python matplotlib imshow 在二维数组上动画马尔可夫链的演变
- r - 验证是否存在另外两封邮件
- python - 使用多个命令创建一个 Stdout 和 stderr 文件并压缩输出
- postgresql - thymeleaf 页面上的源不能为空
- import - SAS proc导入guessingrows问题
- assembly - NASM 程序集 x86:是否可以在循环中编写循环?(需要修复冒泡排序)
- python - 使用网格 Matplotlib 确定绘图大小
- ios - ViewController 何时设置 @IBOutlet 属性?