比较两个不同的对象数组并在 API 调用后找到匹配项时将数据推送到新对象

Comparing two different arrays of objects and pushing data to a new object when a match is found after API Call

我正在尝试创建一张美国 COVID 热点地图。我从 API 获取的对象数组不包括 lat 和 lng 定位,因此我创建了自己的数组以使用 .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 的新数组中供以后使用。自从我创建了第一个数组后,我不确定我是否应该以不同的方式格式化它以使工作更容易,或者我是否应该使用我得到的 URL 中链接的 MySQL table来自 lat/lng。我选择不使用 SQL table 因为我不熟悉该数据类型。

您的 .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 
});

这是我用你的代码和样本数据试过的。

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
  }
]

可以是one-liner

关键观察是您总是在 self-made 数组中查找状态。那么为什么不把它做成一个对象,以状态为键呢?你自己做的,所以你可以自由地做。

这意味着您不必“手动”搜索数组中的状态。如果您有州名,您可以告诉 Javascript 查看该州的数据。

您可以简单地使用 results.map 将原始 stateResult 转换为一个新对象,该对象由原始 stateResult plus 您的 self-made 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
  }
]