我正在尝试将API调用的结果与现有数组进行比较。基本上,我想创建一个将遍历数组的函数,然后遍历API中的数据以查看是否存在匹配项。
这是我正在使用的数组的一个例子
let array = [ {
"name": "student1",
"id": 134},
{
"name": "student2",
"id": 135},
{
"name": "student3",
"id": 136}
]
这是我在JavaScript / jQuery中的功能
function getData() {
$.ajax({
url: "www.studentapi.com",
dataType: "json"
}).done(function(data) {
console.log(data)
}
}
我得到的数据看起来像这样: [{
"id": 134,
"score": 45},
{
"id": 138,
"score": 67},
{
"id": 139,
"score": 34}
]
我试图找到一种在数组和数据中找到匹配ID的方法。到目前为止,我已经尝试过:
for (let j =0; j < data.length; j++) {
if (array[j]["id"] === data[j].id) {
console.log("we have a match!")
}
else {
console.log("not a match!");
}
}
但这不起作用。我在这里做错了什么吗?
答案 0 :(得分:0)
您可以在数组上使用find查找与某些条件匹配的元素。
以下逻辑也使用箭头功能,但可以更改为使用常规function(){}
let array = [
{
"name": "student1",
"id": 134
},
{
"name": "student2",
"id": 135
},
{
"name": "student3",
"id": 136
}
];
let data = [
{
"id": 134,
"score": 45
},
{
"id": 138,
"score": 67
},
{
"id": 139,
"score": 34
}
];
let studentData = array.map(student=>{
student.data = data.find(record=>record.id === student.id) || {};
return student;
});
console.log(studentData);
答案 1 :(得分:0)
我会使用javascript过滤器功能。
let matchingStudents = array.filter(student => {
return data.find(jsonData => student.id === jsonData.id);
});
匹配的学生将使第一个数组中的所有学生都出现在第二个数组中。
如果您想知道语法,那就是ES6。下一代javascript。要用旧的javascript编写,应该是:
var matchingStudents = array.filter(function(student){
return data.find(function(jsonData){ return student.id === jsonData.id});
}
答案 2 :(得分:0)
要专门回答您的问题我在这里做错了什么吗?
您在此处的搜索代码假定array
和data
包含的ID顺序完全相同:
for (let j =0; j < data.length; j++) {
if (array[j]["id"] === data[j].id) {
根据您提供的示例数据,情况并非如此;您不能总是将array[j]
与data[j]
进行比较以匹配ID,因为(例如)您可能需要将array[4]
与data[6]
进行匹配。
解决此问题的一种方法是使用嵌套循环:
for (let i = 0; i < array.length; i++) {
for (let j = 0; j < data.length; j++) {
if (array[i].id === data[j].id) {
这样,您将在查找匹配项时将array
中的每个条目与data
中的每个条目进行比较。 (这与建议array.map
和data.find
的解决方案所采取的措施类似,并且具有一些聪明的提前行为)。
另一种方法是对两个列表进行排序并一起逐步进行。
let array = [
{ "id": 134, "name": "student1" },
{ "id": 139, "name": "student2" },
{ "id": 136, "name": "student3" }
];
let data = [
{ "id": 134, "score": 45 },
{ "id": 138, "score": 67 },
{ "id": 139, "score": 34 }
];
array.sort((a, b) => a.id - b.id)
data.sort((a, b) => a.id - b.id)
let data_i = 0;
for (let array_i = 0; array_i < array.length; array_i++) {
while (data[data_i].id < array[array_i].id) {
data_i++;
}
if (data_i < data.length && data[data_i].id === array[array_i].id) {
console.log(`Matched ${array[array_i].name} to score ${data[data_i].score}`);
} else {
console.log(`No match found for ${array[array_i].name}`);
}
}