javascript - Google Maps API 循环信息窗口
问题描述
我无法读取 json 并将其显示在 infoWindow 上。发生的情况是您只读取对象列表中的最后一个产品。我希望您阅读列表中的所有对象(产品)。
它应该像这样显示在信息窗口中
- id_seller: 1
- name_seller: 卖家 1
- name_Custommer: 客户 2
- 名称_产品product1
- 数量:10
- 名称_产品product2
- 数量:5
- 名称_产品product3
- 数量:20
编码 JavaScript 和 JSON
function initMap() {
const map = new google.maps.Map(document.getElementById("map"), {
zoom: 10,
center: {
lat: -25.363,
lng: -131.044
}
});
const infoWindow = new google.maps.InfoWindow({
maxwidth: 400
});
setMarkers(map, infoWindow);
}
function setMarkers(map, infoWindow) {
const image = {
url: "https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png",
size: new google.maps.Size(10, 12),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(0, 32)
}
// $.get("file.json", function(data) {
function processJson(data) {
var bounds = new google.maps.LatLngBounds();
var a = data;
for (var i = 0; i < a.length; i++) {
var b = a[i].Custommer
for (var j = 0; j < b.length; j++) {
var c = b[j].Products
for (var l = 0; l < c.length; l++) {
const infoWindowContent = a[i].idSeller +
a[i].nameSeller +
b[j].nameCustommer +
c[l].nameProduct +
c[l].amount;
const marker = new google.maps.Marker({
position: {
lat: a[i].lat,
lng: a[i].lng
},
map,
icon: image,
});
bounds.extend(marker.getPosition());
marker.addListener("click", () => {
infoWindow.setContent(infoWindowContent);
infoWindow.open(map, marker);
});
}
map.fitBounds(bounds);
}
}
// })
}
processJson(jsonData);
}
var jsonData = [
{
"idSeller": 1,
"nameSeller": "Seller 1",
"lat": -25.363,
"lng": 131.044,
"Custommer": [
{
"idCustommer": 1,
"nameCustommer": "Custommer 1",
"Products": [
{
"nameProduct": "Product 1",
"amount": 10,
"price": 2.99
},
{
"nameProduct": "Product 2",
"amount": 5,
"price": 10.99
},
{
"nameProduct": "Product 3",
"amount": 20,
"price": 7.99
}
]
}
]
},
{
"idSeller": 2,
"nameSeller": "Seller 2",
"lat": -25.063,
"lng": 131.045,
"Custommer": [
{
"idCustommer": 2,
"nameCustommer": "Custommer 2",
"Products": [
{
"nameProduct": "Product 1",
"amount": 10,
"price": 2.99
},
{
"nameProduct": "Product 2",
"amount": 5,
"price": 10.99
},
{
"nameProduct": "Product 3",
"amount": 20,
"price": 7.99
}
]
}
]
}
]
解决方案
在您的循环中,您将覆盖信息窗口中的产品信息,从而显示列表中的最后一个产品。
最好用更有意义的名称来命名你的变量。
现有代码:
for (var i = 0; i < a.length; i++) {
var b = a[i].Custommer // b == customer
for (var j = 0; j < b.length; j++) {
var c = b[j].Products // c == products
for (var l = 0; l < c.length; l++) {
const infoWindowContent = a[i].idSeller +
a[i].nameSeller +
b[j].nameCustommer +
c[l].nameProduct +
c[l].amount;
const marker = new google.maps.Marker({
position: {
lat: a[i].lat,
lng: a[i].lng
},
map,
icon: image,
});
bounds.extend(marker.getPosition());
marker.addListener("click", () => {
infoWindow.setContent(infoWindowContent);
infoWindow.open(map, marker);
});
}
map.fitBounds(bounds);
}
}
更正的循环,具有有意义的名称:
var sellers = data;
for (var i = 0; i < sellers.length; i++) {
let infoWindowContent = sellers[i].idSeller +
sellers[i].nameSeller+"<br>";
var customers = sellers[i].Custommer
for (var j = 0; j < customers.length; j++) {
var products = customers[j].Products
infoWindowContent += customers[j].nameCustommer+"<br>";
for (var l = 0; l < products.length; l++) {
infoWindowContent += products[l].nameProduct +
products[l].amount+"<br>";
}
}
const marker = new google.maps.Marker({
position: {
lat: sellers[i].lat,
lng: sellers[i].lng
},
map,
icon: image,
});
bounds.extend(marker.getPosition());
marker.addListener("click", () => {
infoWindow.setContent(infoWindowContent);
infoWindow.open(map, marker);
});
}
代码片段:
function initMap() {
const map = new google.maps.Map(document.getElementById("map"), {
zoom: 10,
center: {
lat: -25.363,
lng: -131.044
}
});
const infoWindow = new google.maps.InfoWindow({
maxwidth: 400
});
setMarkers(map, infoWindow);
}
function setMarkers(map, infoWindow) {
const image = {
url: "https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png",
size: new google.maps.Size(10, 12),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(0, 32)
}
// $.get("file.json", function(data) {
function processJson(data) {
var bounds = new google.maps.LatLngBounds();
var sellers = data;
for (var i = 0; i < sellers.length; i++) {
let infoWindowContent = sellers[i].idSeller +
sellers[i].nameSeller+"<br>";
var customers = sellers[i].Custommer
for (var j = 0; j < customers.length; j++) {
var products = customers[j].Products
infoWindowContent += customers[j].nameCustommer+"<br>";
for (var l = 0; l < products.length; l++) {
infoWindowContent += products[l].nameProduct +
products[l].amount+"<br>";
}
}
const marker = new google.maps.Marker({
position: {
lat: sellers[i].lat,
lng: sellers[i].lng
},
map,
icon: image,
});
bounds.extend(marker.getPosition());
marker.addListener("click", () => {
infoWindow.setContent(infoWindowContent);
infoWindow.open(map, marker);
});
}
map.fitBounds(bounds);
// })
}
processJson(jsonData);
}
var jsonData = [{
"idSeller": 1,
"nameSeller": "Seller 1",
"lat": -25.363,
"lng": 131.044,
"Custommer": [{
"idCustommer": 1,
"nameCustommer": "Custommer 1",
"Products": [{
"nameProduct": "Product 1",
"amount": 10,
"price": 2.99
},
{
"nameProduct": "Product 2",
"amount": 5,
"price": 10.99
},
{
"nameProduct": "Product 3",
"amount": 20,
"price": 7.99
}
]
}]
},
{
"idSeller": 2,
"nameSeller": "Seller 2",
"lat": -25.063,
"lng": 131.045,
"Custommer": [{
"idCustommer": 2,
"nameCustommer": "Custommer 2",
"Products": [{
"nameProduct": "Product 1",
"amount": 10,
"price": 2.99
},
{
"nameProduct": "Product 2",
"amount": 5,
"price": 10.99
},
{
"nameProduct": "Product 3",
"amount": 20,
"price": 7.99
}
]
}]
}
]
/* Always set the map height explicitly to define the size of the div
* element that contains the map. */
#map {
height: 100%;
}
/* Optional: Makes the sample page fill the window. */
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
<!DOCTYPE html>
<html>
<head>
<title>Simple Markers</title>
<script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
<script
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap&libraries=&v=weekly"
defer
></script>
<!-- jsFiddle will insert css and js -->
</head>
<body>
<div id="map"></div>
</body>
</html>
推荐阅读
- javascript - 将脚本标签添加到 html 时出现 Chrome 扩展错误
- reactjs - 带有反应选择模块的打字稿。构建失败
- string - 如果这些事实中有 x 个为真,则返回 y
- java - 有可能这样做吗?
- mysql - 根据 SUM 为行分配位置值
- linux - 如何部分编译 python 文件?
- flutter - 当我包装芯片列表时,如何将区域(包装区域)限制为最多 2 行?
- python - 将 Windows 相对路径转换为 POSIX 相对路径,以便我可以加入 POSIX 绝对路径和 Windows 相对路径
- angular - 我想在选中一个复选框时自动选中一些复选框
- r - 如何使列的某些元素彼此相等?