我目前正在尝试通过脚本迭代事件处理中的ManagedObjects列表。
它应该检查列表中每个ManagedObject
的条件,一旦它为真,就返回该对象。
这是我的剧本:
create expression ManagedObject getCurrentDepot(position, listObjects) [
for (i = 0; i <= listObjects.length; i++) {
var obj = listObjects[i];
var distance = distance(position.lat, position.lng, obj.Geofence.lat, obj.Geofence.lng);
if (distance <= obj.radius ) {
depot;
}
}
null;
];
我收到以下错误:
语句mytest中的错误:statement_2! :';'附近的语法不正确在第3栏第26栏
它抱怨这一行:
var obj = listObjects[i];
如何正确迭代列表?
答案 0 :(得分:1)
最好的解决方案是不在表达式中循环,而是在事件处理本身。
create expression Boolean isInRange(position, element) [
var distance = distance(position.lat, position.lng, element.Geofence.lat, obj.Geofence.lng);
if (distance <= element.radius ) {
true;
}
false;
];
insert into MyStreamWithDepot
select
event.listObjects.firstOf(element => isInRange(event.position, element) is true) as currentDepot
from InputEvent event;
您可以在此处查看“firstOf”方法的文档esper documentation
答案 1 :(得分:0)
尝试
var distance;
listObjects.forEach(function(obj) {
distance = distance(position.lat, position.lng, obj.Geofence.lat, obj.Geofence.lng);
if (distance <= obj.radius ) {
depot;
}
});