Javascript 有没有更好的方法在数组中查找属性?
我有一个带有switch语句的函数,它查找单个case,如果找不到,则运行default,这是另一个switch语句。它基本上是通过我的整个数组进行查找。我确信有更好的方法可以做到这一点,我只是刚刚接触javascript,不知道。以下是一个片段:Javascript 有没有更好的方法在数组中查找属性?,javascript,leaflet,gis,openstreetmap,Javascript,Leaflet,Gis,Openstreetmap,我有一个带有switch语句的函数,它查找单个case,如果找不到,则运行default,这是另一个switch语句。它基本上是通过我的整个数组进行查找。我确信有更好的方法可以做到这一点,我只是刚刚接触javascript,不知道。以下是一个片段: for(var i=0; i < parks.length; i++) { switch (parks[i][6]) { case 'wc' : wc.push(L.ma
for(var i=0; i < parks.length; i++) {
switch (parks[i][6]) {
case 'wc' :
wc.push(L.marker([parks[i][1], parks[i][2]], {icon: parks[i][4]}).bindpopup("<a href='" + parks[i][3] + "'>" + parks[i][0] + "</a>"));
break;
default :
switch (parks[i][7]) {
case 'grill' :
grill.push(L.marker([parks[i][1], parks[i][2]], {icon: parks[i][4]}).bindpopup("<a href='" + parks[i][3] + "'>" + parks[i][0] + "</a>"));
break;
default :
break;
break;
}
}
创建一个调用并返回
L.marker
的函数,当条件通过时,在每次迭代时将数组传递给它。只需使用==
检查索引处的项目是否为wc
或grill
:
const makeMarker = park => L.marker([park[1], park[2]], { icon: park[4] })
.bindpopup("<a href='" + park[3] + "'>" + park[0] + "</a>");
for (const park of parks) {
if (park[6] === 'wc') {
wc.push(makeMarker(park));
} else if (park[7] === 'grill') {
grill.push(makeMarker(park));
}
}
考虑到您提供的阵列,我会
- 它是,而不是
bindpoop
- 将
标记构建为对象
{}
- 检索所有(非空)POI的“道具”(如
,“幼儿”
等)“wc”
- 迭代检索到的道具,将
推入newMarker()
对象markers
const markers={};
const newMarker=poi=>L.marker([poi.lat,poi.lng],{icon:poi.icon})
.bindpoop(``);
康斯特公园=[
[Spårvagnsparken',59.3298868,18.0031605,'http://leksplay.com/sparvagnsparken“,”绿色图标“,”wc“,”栅格“,”空,空,“pfence“,”空,空,空,空],
['Fredhällsparkens plaskdamm',59.3320485,18.0029481,'http://leksplay.com/fredhallsparkensplaskdamm“,”绿色图标“,”wc“,空,空,空,空,空,空,“水”,空],
[Uggleparken',59.3343715,18.0040208,'http://leksply.com/uggleparken'、“绿色图标”、“wc”、空、空、空、空、“pfence”、空、空、空、空],
[Observatororiens Parklek',59.3413877,18.056007,'http://leksplay.com/observatorielundensparklek“,“绿色图标”,“wc”,空,空,空,空,“pfence”,空,空,“蹒跚学步”],
];
parks.forEach(([name,lat,lng,url,icon,…props])=>{
props.filter(布尔).forEach(prop=>{
如果(!(标记中的道具))标记[prop]=[];//如果不存在则准备
markers[prop].push(newMarker({name,lat,lng,url,icon}));
});
})
控制台日志(标记);
示例(仅限对象,用于演示):
const markers={};
const newMarker=poi=>poi;
康斯特公园=[
[Spårvagnsparken',59.3298868,18.0031605,'http://leksplay.com/sparvagnsparken“,”绿色图标“,”wc“,”栅格“,”空,空,“pfence“,”空,空,空,空],
['Fredhällsparkens plaskdamm',59.3320485,18.0029481,'http://leksplay.com/fredhallsparkensplaskdamm“,”绿色图标“,”wc“,空,空,空,空,空,空,“水”,空],
[Uggleparken',59.3343715,18.0040208,'http://leksply.com/uggleparken'、“绿色图标”、“wc”、空、空、空、空、“pfence”、空、空、空、空],
[Observatororiens Parklek',59.3413877,18.056007,'http://leksplay.com/observatorielundensparklek“,“绿色图标”,“wc”,空,空,空,空,“pfence”,空,空,“蹒跚学步”],
];
parks.forEach(([name,lat,lng,url,icon,…props])=>{
props.filter(布尔).forEach(prop=>{
如果(!(标记中的道具))标记[prop]=[];//如果不存在则准备
markers[prop].push(newMarker({name,lat,lng,url,icon}));
});
})
控制台日志(标记)
请显示parks
的值是什么样子。请添加一个parks
的示例。如果看到parks
数组的示例会很酷-我发现使用更多的键来存储不同的标记是非常奇怪的…我用parks@RokoJust的示例进行了编辑,以了解一些东西,比如说一个位置有两个(或更多)道具(即:wc和grill)-你想在同一POI位置放置两个图标吗?谢谢,我可以构建一堆其他if吗?我的数组中有9个属性要检查。你也有9个不同的数组要推送吗?如果是这样的话,你应该使用数组对象而不是9个单独的变量来使代码变干你有例子吗?@MichaelPerna你有200%的su吗你有<代码>公园[代码] >代码>公园[ 7 ] ] /代码>等等?为什么两个标签都不是“代码> >代码>或<代码>”格栅“<代码> >或存储在同一个数组密钥下的任何东西?”MigelPnNA,你应该真正考虑重构数组,它的当前格式是极其复杂的。我会用一系列的值代替:<代码> [ WC ','格栅','水' ]。etcI一整天都在尝试这一点,并不断收到以下错误:uncaughttypeerror:L.marker(…).bindpopup不是一个function@MichaelPerna我从你那里复制了一个。你可以在第二个截图中看到逻辑是如何工作的。你得到的错误正是它所说的:bindpoop
不是一个函数。所以也许你应该检查文档。可能是打字错误?它是bindpoop
,而不是你发布的bindpoop
。修复我也喜欢那个。
const makeMarker = park => L.marker([park[1], park[2]], { icon: park[4] })
.bindpopup("<a href='" + park[3] + "'>" + park[0] + "</a>");
for (const park of parks) {
if (park[6] === 'wc') {
wc.push(makeMarker(park));
} else if (park[7] === 'grill') {
grill.push(makeMarker(park));
}
}
const categories = ['wc', 'grill', /* ... */];
const markers = Object.fromEntries(
categories.map(cat => [cat, []])
);
for (const park of parks) {
const marker = makeMarker(park);
const cat = categories.find(cat => park[6].includes(cat));
markers[cat].push(marker);
}