Сравнение информации из вызова API и массива - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь сравнить результаты вызова 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}
]

Я пытаюсь найти способ найти совпадающие идентификаторы в массиве и в данных. Пока я пробовал:

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 голосов
/ 22 марта 2019

Я бы использовал функцию фильтра javascript.

let matchingStudents = array.filter(student => {
    return data.find(jsonData => student.id === jsonData.id);
});

Там, где MatchStudents будет содержать всех студентов, присутствующих в первом массиве, которые присутствуют во втором.

Если вам интересно узнать осинтаксис, это ES6.Javascript следующего поколения.Чтобы написать это в старом javascript, это будет:

var matchingStudents = array.filter(function(student){
     return data.find(function(jsonData){ return student.id === jsonData.id});
}
0 голосов
/ 22 марта 2019

Чтобы конкретно ответить на ваш вопрос Я что-то здесь не так делаю?

Ваш поисковый код здесь предполагает, что array и data будут содержать одинаковые идентификаторы в том же порядке:

for (let j =0; j < data.length; j++) {
    if (array[j]["id"] === data[j].id) {

На основании предоставленных вами образцов данных это не так; Вы не можете всегда сравнивать array[j] с data[j], чтобы соответствовать идентификаторам, потому что (например) возможно, вам нужно сопоставить 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}`);
  }  
}
0 голосов
/ 22 марта 2019

Вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...