Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有更好的方法在数组中查找属性?_Javascript_Leaflet_Gis_Openstreetmap - Fatal编程技术网

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

我有一个带有switch语句的函数,它查找单个case,如果找不到,则运行default,这是另一个switch语句。它基本上是通过我的整个数组进行查找。我确信有更好的方法可以做到这一点,我只是刚刚接触javascript,不知道。以下是一个片段:

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);
}