您可以使用 Array.prototype.flatMap() 方法从嵌套结果中生成一个扁平数组。
结合filter()
方法,可以将扁平列表缩小到匹配的城市:
// 您的简化数据
const stateNames = [{"state":"Iowa ","id":"IA","places":[{"city":"Ames","description":"ames-description"},{"city":"Davenport ","description":"davenport-description"}]},{"state":"Illinois ","id":"IL","places":[{"city":"Chicago","description":"chicago-description"},{"city":"Elgin ","description":"elgin-description"},{"city":"Joliet ","description":"joliet-description"}]}];
// 创建一个扁平映射
const allPlaces = stateNames.flatMap(({ state, id, places }) =>
places.map((place) => ({
stateName: state.trim(),
stateId: id,
...place,
})),
);
// 根据城市过滤
const cityname = 'Elgin';
const matches = allPlaces.filter(({ city }) => city.trim() === cityname);
console.log(matches);
这样做的好处是可以创建一个单一列表,您可以在其中多次搜索不同的匹配项(这是相当常见的搜索用途)。
在React应用程序的上下文中,您可以像这样使用它:
import stateNames from './states.json'; // 这里假设是从states.json导入的数据
const allPlaces = stateNames.flatMap(({ state, id, places }) =>
places.map((place) => ({
stateName: state.trim(),
stateId: id,
...place,
})),
);
const CityDetailsPage = () => {
// 从URL获取城市名
const { cityname } = useParams();
const cities = allPlaces.filter(({ city }) => city.trim() === cityname);
return (
<>
{cities.map((place) => (
<p>
{place.city}, {place.stateId}<br />
{place.stateName}<br />
{place.description}
</p>
))}
</>
);
};