javascript - 从 API JSON 数据硬编码每个值/属性
问题描述
我正在练习 javascript,并且在对我正在使用的 JSON 中的两个属性进行硬编码时遇到了一些麻烦:strMeasure
和strIngredient
. 我想删除每个具有 null 值strMeasure
的strIngredient
属性,但我无法弄清楚如何去做,或者在尝试时失败。我做错了什么或错过了什么?我需要做什么才能实现这一目标?我不需要关于如何从其 API JSON 内部为每个属性执行此操作的答案,但是一个或两个示例会很好地了解这一点(例如strMeasure7
等等strIngredient7
)。
这是我正在处理的代码,到目前为止:
const url = "https://www.thecocktaildb.com/api/json/v1/1/search.php?s=margarita";
const list = document.querySelector(".results");
async function getMargaritas() {
try {
const response = await fetch(url);
const data = await response.json();
for (let i = 0; i < data.drinks.length; i++) {
list.innerHTML += `<div class="result">
<h1> ${data.drinks[i].strDrink} </h1>
<ul>
<li> ${data.drinks[i].strMeasure1} ${data.drinks[i].strIngredient1}</li>
<li> ${data.drinks[i].strMeasure2} ${data.drinks[i].strIngredient2}</li>
<li> ${data.drinks[i].strMeasure3} ${data.drinks[i].strIngredient3}</li>
<li> ${data.drinks[i].strMeasure4} ${data.drinks[i].strIngredient4}</li>
<li> ${data.drinks[i].strMeasure5} ${data.drinks[i].strIngredient5}</li>
<li> ${data.drinks[i].strMeasure6} ${data.drinks[i].strIngredient6}</li>
<li> ${data.drinks[i].strMeasure7} ${data.drinks[i].strIngredient7}</li>
</ul>
</div>`;
}
} catch (error) {
list.innerHTML = theError("Whoops, sorry! No drink for you this time.. Better luck next time 😉");
}
}
getMargaritas();
function theError(message = "Error") {
return `<div class="error">${message}</div>`;
}
<div class="results"></div>
如果有不清楚的地方或者我需要在这里进一步详细说明,请告诉我
解决方案
Id 做的第一件事就是将稍微疯狂的响应变成更有意义的东西,您还可以在其中过滤掉无效成分:
function makeNonBonkersResult(data){
const fields = [1,2,3,4,5,6,7]
return data.drinks.map(d => {
return {
name: d.strDrink,
ingredients: fields.filter(f => d["strIngredient" + f] != null)
.map(f => ({ingredient: d["strIngredient" + f], measure: d["strMeasure" + f]}))
}
})
}
这会将您从 api 获得的响应变成更容易使用的东西
[
{
name:"Margarita",
ingredients: [ {ingredient: "Tequila", measure: "1 1/2 Oz"}, {ingredient:"...", measure: "..."} ]
}
]
然后它变得更容易渲染,因为您只需遍历ingredients
数组。如下所示:
const url = "https://www.thecocktaildb.com/api/json/v1/1/search.php?s=margarita";
const list = document.querySelector(".results");
async function getMargaritas() {
try {
const response = await fetch(url);
const data = makeNonBonkersResult(await response.json());
for (let i = 0; i < data.length; i++) {
const drink = data[i];
list.innerHTML += `<div class="result">
<h1> ${drink.name} </h1>
<ul>`
for(let j=0;j<drink.ingredients.length;j++){
list.innerHTML += `<li>${drink.ingredients[j].measure || ""} ${drink.ingredients[j].ingredient}</li>`
}
list.innerHTML += `</ul>
</div>`;
}
} catch (error) {
list.innerHTML = theError("Whoops, sorry! No drink for you this time.. Better luck next time 😉");
}
}
getMargaritas();
function theError(message = "Error") {
return `<div class="error">${message}</div>`;
}
function makeNonBonkersResult(data){
const fields = [1,2,3,4,5,6,7]
return data.drinks.map(d => {
return {
name: d.strDrink,
ingredients: fields.filter(f => d["strIngredient" + f] != null)
.map(f => ({ingredient: d["strIngredient" + f], measure: d["strMeasure" + f]}))
}
})
}
<div class="results"></div>
推荐阅读
- typo3 - TYPO3 使用带有条件的标记
- javascript - 转换时从 Javascript 获取目标样式
- python - func 必须是一个可调用的或文本引用
- python - 在 dask 上按组应用功能的最佳实践
- python - 使用 SQLAlchemy 查询 SQL Server JSON 列
- symfony - Symfony 3:用户登录后对控制器的全局调用
- python - Python- os.chdir 在执行时会考虑一个打开的 excel 文件实例
- blazor - 如何在 blazor 中设置页面标题?
- javascript - 如何使用 firestoreConnect 从 Firestore 获取数据?
- php - 如何在 Azure 上上传 PHP 文件