我有两个包含相似类型对象的列表,我希望对交叉对象进行操作。
有没有办法使用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)
任何高尔夫球或编辑优化都表示赞赏。
答案 0 :(得分: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)
快。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)
慢。如果这对你没用,我很抱歉。