3 回答
TA贡献1876条经验 获得超7个赞
正如 Todd R 所说,你只需要在访问属性之前找到你真正想要的数组元素。您也不需要,JSON.stringify因为这些值已经是字符串或数字,可以直接放入 HTML 中。将它们包装在 stringify 调用中将导致将引号添加到字符串值中,例如。
<li>City: "San Francisco"</li>
示例代码:
xhr.onload = function(){
const city = document.getElementById('city').value;
if(this.status == 200){
let cityWeathers;
try {
cityWeathers = JSON.parse(this.responseText);
} catch (e) {
// JSON not valid, show error message
}
const cityWeather = Array.isArray(cityWeathers) && cityWeathers.find((obj)=>obj.name === city);
if (cityWeather) {
const result = `<ul><li>City: ${cityWeather.name}</li>` +
`<li>Weather: ${cityWeather.weather[0].description}</li>` +
`<li>Latitude: ${cityWeather.coord.lat}</li>` +
`<li>Longitude: ${cityWeather.coord.lon}</li></ul>`;
document.getElementById('weather').innerHTML = result
}
}
}
TA贡献1801条经验 获得超8个赞
这是一个略有不同的演示,展示了使用fetch()作为执行 Ajax 的新 Vanilla Javascript 方式:
我只获取一次数据(在加载时,然后扫描数组以查找与城市匹配的模式。这绑定到keyup输入字段的事件,使按钮过时。
var data, ct=document.querySelector('#city'), wt=document.querySelector('#weather');
fetch('https://jsonplaceholder.typicode.com/users')
.then(function(r){r.json().then(function(da){data=da;
document.querySelector('#all').innerHTML=data.map(function(v){return v.address.city}).join(', ');});
})
ct.addEventListener('keyup',function(){
wt.innerHTML='';
var i,n=data.length, rx=new RegExp(ct.value,'i');
for (i=0;i<n;i++) if (rx.test(data[i].address.city)) {
wt.innerHTML=data[i].address.city+': '+data[i].address.zipcode
}
});
<input id="city"><br>
<div id="all"></div>
<h1>City and zip code</h1>
<div id='weather'></div>
TA贡献1829条经验 获得超7个赞
您快到了。在“forEach”评论开始的地方,通过weatherTest“找到”(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)匹配“city”的元素”。然后使用从“find”返回的元素来构建“result”。
添加回答
举报