目前正在开发一个用于搜索饮料配方的网络应用程序。这个想法是搜索一种饮料,并将名称、成分和尺寸显示给用户。我正在努力寻找一种有效的方法来迭代API响应,因为它们不会以数组的形式返回。下面是一个示例响应。
dateModified :"2015-08-18 14:54:32"
idDrink:"11668"
strAlcoholic:"Alcoholic
strCategory:"Ordinary Drink"
strDrink: "Long Island Tea"
strDrinkThumb: "https://www.thecocktaildb.com/images/media/drink/ywxwqs1439906072.jpg"
strGlass: "Highball glass"
strIBA:null
strIngredient1: "Vodka"
strIngredient2:"Light rum"
strIngredient3:"Gin"
strIngredient4:"Tequila"
strIngredient5: "Lemon"
strIngredient6: "Coca-Cola"
strIngredient7:""
strIngredient8:""
strIngredient9:""
strIngredient10:""
strIngredient11:""
strIngredient12:""
strIngredient13:""
strIngredient14:""
strIngredient15:""
strInstructions:
"Combine all ingredients (except cola) and pour over ice in a highball glass. Add the splash of cola for color. Decorate with a slice of lemon and serve."
strMeasure1:"1/2 oz "
strMeasure2:"1/2 oz "
strMeasure3: "1/2 oz "
strMeasure4: "1/2 oz "
strMeasure5:"Juice of 1/2 "
strMeasure6:"1 splash "
strMeasure7:" "
strMeasure8:" "
strMeasure9:" "
strMeasure10:" "
strMeasure11:" "
strMeasure12:" "
strMeasure13:" "
strMeasure14:" "
strMeasure15:" "
strVideo: null
字符串
目标是将一些信息Map到一个表。有没有一种迭代的方法来清理这个问题,以便只返回有值的成分?或者最好的解决方案是创建一个单独的文件来格式化成分?
目前,我能想到的阻力最小的路径是创建以下15次:strIngredient1 !=""
的。
下面是API调用:
$('#drinkSearch').click(function(){
var word = document.getElementById("sbar").value;
event.preventDefault();
console.log(word)
$.getJSON("https://www.thecocktaildb.com/api/json/v1/1/search.php?s="+ word, function(Result) {
console.log(Result)
Result.drinks.forEach(function(ingredients){
var ing1 = ingredients.strIngredient1;
console.log(ing1);
})
});
});
型
4条答案
按热度按时间qv7cva1a1#
该API为每个饮料返回一个对象,其中包含
strIngredient1
到strIngredient15
,strMeasure1
到strMeasure15
等键-确实设计得很糟糕。你可以把所有这些放在一个数组中。处理空值有两种不同的方法。您可以简单地过滤空值或将度量值与其成分匹配:
简单过滤空值
这些方法只是从每个要构建的数组中删除空值。这可能会导致不一致,因为
strMeasure
键实际上依赖于strIngredient
键,* 位置上 *。寻找下面的匹配方法来解决这个问题。另一个问题是,成分和措施有时可能是无序的。匹配方法不存在此问题。
字符串
在
filter
中,key.startsWith("strIngredient")
确保您获得正确的15个键,&& value && value.trim()
确保值既不是null
,也不是空的,也不是空白(因此是trim
)。所有三种变化都是随机使用的。一个不那么冗余的表单可能看起来像这样:
型
将度量值与度量值的成分匹配
这种方法首先为
strIngredient
s和strMeasure
s构建两个数组。使用parseInt(key.slice(keyName.length))
提取数字键。Object.assign
将几个{key: value}
对象放到一个数组中,其中key
是数字,这意味着用这些数字键和值构建一个数组。然后过滤这些值,使得如果具有 * 相同索引 * 的 * 任何 * 值非空,则它们保留。
型
1:从对象构建数组通常也适用于
Array.from
,但它也需要length
属性。而不是计算,我只是继续使用Object.assign
代替。2izufjch2#
替代解决方案可以是:
字符串
})
型
ux6nzvsh3#
我喜欢Xufox的回答,这里有另一种驯服API的可能性,通过对
manhattan
的硬编码调用:)这里的想法是将各种东西编组到包含有用数据的最终recipe
中。注意,我重构了这个函数,以展示如何(也许应该)将Map提取到一个单独的函数中。
个字符
7gs2gvoe4#
更简单的解决方案相信你已经从cocktail API获得了成功的响应,简单的方法是考虑替换drinks[0].strIngredient{num}末尾的数字并检查值是否为null,如果值为null,你可以忽略它并打印非null值。我有一个代码片段如下::
我已经测试过了,这适用于其他参数
字符串
JSON也是如此。希望这有帮助!!!