比较两个不同的对象数组并在 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
}
]
我正在尝试创建一张美国 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
}
]