【问题标题】:Iterating over list in event processing在事件处理中迭代列表
【发布时间】:2018-11-30 01:30:45
【问题描述】:

我目前正在尝试通过脚本迭代事件处理中的 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];

如何正确迭代列表?

【问题讨论】:

    标签: esper cumulocity


    【解决方案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;
    

    你可以在这里esper documentation查看“firstOf”方法的文档

    【讨论】:

    • 但这只会取第一个满足条件的元素,不是吗?如果其他元素也满足条件呢?
    • 是正确的 firstOf 只会返回第一个匹配项。也许检查 takeWhile() 函数。它可能适合您的需要。
    • 考虑到您提到的 takeWhile() 并遵循您编写的示例,每次 takeWhile() 返回一个值时,MyStreamWithDepot 流将被触发或将在所有事件中仅触发一次适用于 takeWhile() 中的条件?
    • 也许你应该把它移到一个自己的问题中,因为这与这里的问题无关。我从未使用过它,但它看起来像返回一个集合
    【解决方案2】:

    试试

    var distance;
    listObjects.forEach(function(obj) {          
            distance  = distance(position.lat, position.lng, obj.Geofence.lat, obj.Geofence.lng); 
             if (distance <= obj.radius ) { 
                 depot; 
             } 
         }); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多