Сравнение двух разных массивов объектов и отправка данных в новый объект при обнаружении совпадения после вызова API

Я пытаюсь создать карту горячих точек COVID в США. Массив объектов, который я получаю от API, не включает позиционирование широты и долготы, поэтому я создал свой собственный массив для передачи этих значений в возвращаемый массив с помощью оператора .then. Проблема, с которой я сталкиваюсь, заключается в том, что созданный мной массив не позволяет мне запускать на нем функцию .forEach и помещать значения в новый (третий) массив. Ниже мой код и небольшой образец каждого из массивов. Я получил информацию о широте / долготе отсюда https://inkplant.com/code/us-state-mysql-table.

Мой массив:

let StateLatLng = [ 
{state: "Alabama", lat: 32.806671, lng: -86.791130},
{state: "Alaska", lat: 61.370716, lng: -152.404419},
{state: "Arizona", lat: 33.729759, lng: -111.431221},
{state: "Arkansas", lat: 34.969704, lng: -92.373123},
etc... ]

Массив, возвращенный из API:

0: Object { state: "California", updated: 1603065757213, cases: 875557, … }
1: Object { state: "Texas", updated: 1603065757213, cases: 870156, … }
2: Object { state: "Florida", updated: 1603065757213, cases: 755020, … }
3: Object { state: "New York", updated: 1603065757213, cases: 519994, … }

Мой код:

.then((result) => {
  let data = new Set(result.map((item) => item.state));
  StateLatLng.forEach((item) data.has(item.state) && (item.lat = test);
  console.log(data);
})

Я пытаюсь использовать общее имя состояния для обоих массивов, чтобы найти соответствующий объект, а затем поместить данные в новый массив с именем data для последующего использования. Поскольку я создал первый массив, я не уверен, следует ли мне отформатировать его по-другому, чтобы упростить работу, или мне следует использовать таблицу MySQL, связанную с URL-адресом, из которого я получил широту/долготу. Я решил не использовать таблицу SQL, потому что не знаком с этим типом данных.


person Alex Motor    schedule 19.10.2020    source источник


Ответы (3)


Это может быть однострочный

Ключевым наблюдением является то, что вы ВСЕГДА просматриваете состояние в своем самодельном массиве. Так почему бы не сделать его объектом с состоянием в качестве ключа? Вы сделали это сами, так что вы вольны делать это.

Это означает, что вам не нужно вручную искать состояние в вашем массиве. Если у вас есть имя состояния, вы можете просто указать Javascript просмотреть данные этого состояния.

Вы можете просто использовать results.map для преобразования исходного stateResult в новый объект, состоящий из исходного stateResult плюс соответствующий элемент вашего собственного объекта LatLng, используя: ({...StateLatLng[stateResult.state],...stateResult})

let StateLatLng = {
  "Alabama": {
    lat: 32.806671,
    lng: -86.791130
  },
  "Alaska": {
    lat: 61.370716,
    lng: -152.404419
  },
  "Arizona": {
    lat: 33.729759,
    lng: -111.431221
  },
  "Arkansas": {
    lat: 34.969704,
    lng: -92.373123
  },
}


let results = [{
    state: "Alabama",
    updated: 1603065757213,
    cases: 875557
  },
  {
    state: "Alaska",
    updated: 1603065757213,
    cases: 870156
  },
  {
    state: "Arizona",
    updated: 1603065757213,
    cases: 755020
  },
  {
    state: "Arkansas",
    updated: 1603065757213,
    cases: 519994
  }
]



console.log(
  results.map(
    stateResult => ({
      ...StateLatLng[stateResult.state],
      ...stateResult
    })
  )
)

Результат выглядит следующим образом:

[
  {
    "lat": 32.806671,
    "lng": -86.79113,
    "state": "Alabama",
    "updated": 1603065757213,
    "cases": 875557
  },
  {
    "lat": 61.370716,
    "lng": -152.404419,
    "state": "Alaska",
    "updated": 1603065757213,
    "cases": 870156
  },
  {
    "lat": 33.729759,
    "lng": -111.431221,
    "state": "Arizona",
    "updated": 1603065757213,
    "cases": 755020
  },
  {
    "lat": 34.969704,
    "lng": -92.373123,
    "state": "Arkansas",
    "updated": 1603065757213,
    "cases": 519994
  }
]

person Eureka    schedule 19.10.2020
comment
Это удивительно! Благодарю вас! Это имеет большой смысл. Я выбрал это как ответ, потому что я действительно собираюсь использовать это после изменения моего массива. - person Alex Motor; 19.10.2020

Ваш код в вашей функции .then нелогичен. Если бы я хотел, чтобы массив результатов содержал ваши широты и долготы, я бы сделал так:

.then(result=>{
  for(let o of result){
    for(let p of StateLatLng){
      if(o.state === p.state){
        o.lat = p.lat; o.lng = p.lng; // probably really just want to do your map stuff here
      }
    }
  }
  // result Array now has latitudes and longitudes 
});
person StackSlave    schedule 19.10.2020
comment
Потрясающие! Спасибо вам за вашу помощь! - person Alex Motor; 19.10.2020

Это то, что я пробовал с вашим кодом и примерами данных.

let StateLatLng = [ 
    {state: "Alabama", lat: 32.806671, lng: -86.791130},
    {state: "Alaska", lat: 61.370716, lng: -152.404419},
    {state: "Arizona", lat: 33.729759, lng: -111.431221},
    {state: "Arkansas", lat: 34.969704, lng: -92.373123}
];

let results = [
    { state: "Alabama", updated: 1603065757213, cases: 875557 },
    { state: "Alaska", updated: 1603065757213, cases: 870156 },
    { state: "Arizona", updated: 1603065757213, cases: 755020 },
    { state: "Arkansas", updated: 1603065757213, cases: 519994 }
]

let newStateLatLng = [], data = [];

StateLatLng.map(item => {
    newStateLatLng[item['state']] = item;
})

results.forEach(item => {
    if (item.state && newStateLatLng[item.state]) {
        item['lat'] = newStateLatLng[item.state].lat;
        item['lng'] = newStateLatLng[item.state].lng;
        data.push(item);
    }
})

console.log(data);

Результат

[
  {
    state: 'Alabama',
    updated: 1603065757213,
    cases: 875557,
    lat: 32.806671,
    lng: -86.79113
  },
  {
    state: 'Alaska',
    updated: 1603065757213,
    cases: 870156,
    lat: 61.370716,
    lng: -152.404419
  },
  {
    state: 'Arizona',
    updated: 1603065757213,
    cases: 755020,
    lat: 33.729759,
    lng: -111.431221
  },
  {
    state: 'Arkansas',
    updated: 1603065757213,
    cases: 519994,
    lat: 34.969704,
    lng: -92.373123
  }
]
person pynode    schedule 19.10.2020
comment
Потрясающий! Спасибо за помощь. - person Alex Motor; 19.10.2020