为什么我有时不需要使用 'get' 而有时需要使用 'get' 进行过滤?

why should I sometimes don't need to use 'get' while othertimes need to use 'get' for filtering?

我正在尝试理解 mapboxgl.js 表达式。

我知道 'get' 用于获取属性中键的值,例如

 ['-', 2017, ['number', ['get', 'Constructi'], 2017]]

但是在某些情况下,要获取值,我不需要像

那样使用'get'
function filterBy(month) {
var filters = ['==', 'month', month];
map.setFilter('earthquake-circles', filters);
map.setFilter('earthquake-labels', filters);
 
// Set the label to the month
document.getElementById('month').textContent = months[month];
}

在这种情况下,我只需要输入'key'即'month'。

为什么有时我必须使用 'get' 而其他时候只需键入一个键就可以了?

我试图调整 mapbox 示例中的代码。 https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/

我只想显示悬停的多边形。

所以我加了一行

map.on('mousemove', 'state-fills', function (e) {
            if (e.features.length > 0) {
                if (hoveredStateId !== null) {
                    map.setFeatureState(
                        { source: 'states', id: hoveredStateId },
                        { hover: false }
                    );
                }
                hoveredStateId = e.features[0].id;
                map.setFeatureState(
                    { source: 'states', id: hoveredStateId },
                    { hover: true }
                );
            }
          map.setFilter('state-fills',['==',['feature-state','hover'],true])

        });

它没有成功,所以我认为“出于某种原因”我必须添加 'get'。 所以我尝试了

map.setFilter('state-fills',['==',['get',['feature-state','hover'] ],true])

也没成功。 所以我假设我可能必须添加 'boolean' 而不是 'get' 因为它会评估检索到的值是否为真。

  map.setFilter('state-fills',['==',['boolean',['feature-state','hover'] ],true])

None 其中有工作。 我做错了什么?

您应该始终使用 get 访问属性。

不带 get 的版本是较旧的语法,仅部分受支持。如果你试图混合搭配,你会得到非常混乱的错误。例如:

filter: ['==', 'val', 1] // works

filter: ['==', ['get', 'val'], 2] // works

filter: ['any', ['==', 'val', 1'], ['==', ['get', 'val'], 2]] // doesn't work

然而,你在这里做什么:

map.setFilter('state-fills',['==',['get',['feature-state','hover'] ],true])

这是错误的,因为 ['feature-state','hover'] 不是属性,它是特征状态。

您不能按功能状态过滤。

解决方案 1

您可能想要执行以下操作:

map.setPaintProperty('state-fills', 'fill-opacity', ['case', ['to-boolean', ['feature-state','hover']], 1, 0.5]);

即:如果事物未悬停(或其他),则使用特征状态将填充不透明度设置为 0.5。

解决方案 2

map.setFilter('state-fills', ['==', ['id'], hoveredStateId]);