在CoffeeScript中迭代两个数组上的匹配元素

时间:2017-12-10 22:34:33

标签: coffeescript

我有两个包含相似类型对象的列表,我希望对交叉对象进行操作。

有没有办法使用CoffeeScript简化这种循环?

for a in aList
    for b in bList
        if a.id == b.id
            doSomething a

这是我能想到的最好但是它仍然有点混乱:

doSomething a for a in aList when a.id in (b.id for b in bList)

任何高尔夫球或编辑优化都表示赞赏。

1 个答案:

答案 0 :(得分:1)

这个怎么样?我认为你的情况有两种模式。请将此视为几个答案之一。

模式1

在您的脚本中编写的简单方法如下。

for a in aList
    for b in bList
        if a.id == b.id
            doSomething a

当它被转换为理解脚本时,就在下面。

doSomething b for b in bList when b.id is a.id for a in aList

编译两个脚本时,结果如下:

for (i = 0, len = aList.length; i < len; i++) {
  a = aList[i];
  for (j = 0, len1 = bList.length; j < len1; j++) {
    b = bList[j];
    if (a.id === b.id) {
      doSomething(a);
    }
  }
}

注意:

  • 这种方式比doSomething a for a in aList when a.id in (b.id for b in bList)快。

模式2

aList.map (a) -> bList.filter (b) -> a.id is b.id && doSomething a

编译此脚本时,结果如下。

aList.map(function(a) {
  return bList.filter(function(b) {
    return a.id === b.id && doSomething(a);
  });
});

注意:

  • 这种方式比doSomething a for a in aList when a.id in (b.id for b in bList)慢。

如果这对你没用,我很抱歉。