比较来自API调用和数组的信息

时间:2019-03-21 22:36:07

标签: javascript jquery json loops match

我正在尝试将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!");
    }
}

但这不起作用。我在这里做错了什么吗?

3 个答案:

答案 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)

要专门回答您的问题我在这里做错了什么吗?

您在此处的搜索代码假定arraydata包含的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.mapdata.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}`);
  }  
}