Coffeescript 咖啡脚本';在';不像Python';s

Coffeescript 咖啡脚本';在';不像Python';s,coffeescript,Coffeescript,咖啡脚本: list = [[0, 0], [0, 1], [1, 0]] console.log [0, 0] in list #false console.log [1, 0] in list #false console.log [0, 1] in list #false console.log [1, 1] in list #false Python: >>> lst = [[0, 0], [0, 1], [1, 0]] >>

咖啡脚本:

list = [[0, 0], [0, 1], [1, 0]]
console.log [0, 0] in list     #false
console.log [1, 0] in list     #false
console.log [0, 1] in list     #false
console.log [1, 1] in list     #false
Python:

>>> lst = [[0, 0], [0, 1], [1, 0]]
>>> [0, 0] in lst
True
>>> [1, 0] in lst
True
>>> [0, 1] in lst
True
>>> [1, 1] in lst
False

我如何让CoffeeScript复制Python的“in”来实现这一点?

它确实按照您想要的方式工作,但它是通过引用实现的:

item1 = [0, 0]
item2 = [0, 1]
item3 = [1, 0]
item4 = [1, 1]

list  = [item1, item2, item3]

console.log item1 in list # true
console.log item2 in list # true 
console.log item3 in list # true
console.log item4 in list # false
要通过深度检查而不是引用使其工作,您必须使用coffee脚本编译器,将此功能添加到coffee脚本语言中,然后提交拉取请求,说服守门员这是一个好功能,并希望他们将其合并

list = [[0, 0], [0, 1], [1, 0]]
contains = (lst, compare) ->
  ret = true for l in lst when l[0] is compare[0] and l[1] is compare[1]       
  return Boolean ret

console.log contains list, [0, 0] # true
console.log contains list, [1, 0] # true
console.log contains list, [0, 1] # true
console.log contains list, [1, 1] # false

Coffeescript将列表中的
item1转换为(忽略处理没有
indexOf
的浏览器的补丁):

因此,它受到Javascript编码方式
indexOf
的限制。

indexOf使用严格相等(与===或三重相等运算符使用的方法相同)将searchElement与数组的元素进行比较

这大致相当于Python列表搜索,它使用
is
来比较
item1
list[i]
。比较这两条python语句

[[0,1] is l for l in alist]
[alist[1] is l for l in alist]
要编写与Python行为相同的Coffeescript(或Javascript),需要一种比较两个数组的方法。比较

[0,1]==[0,1]
所有3种语言。只有Python才是如此

下划线
实现深度比较:

isEqual(对象,其他) 在两个对象之间执行优化的深度比较,以确定它们是否应被视为相等

使用该函数,我可以定义一个函数,如果找到该项,则返回该项;如果没有,则返回未定义项

ud = require 'underscore'
myin = (list, item)->
  ud.find(list,(x)->
    ud.isEqual(item,x))
myin(list,[0,0])
    # [ 0, 0 ]
myin(list,[0,3])
    # undefined
myin(list,[0,1])?
    # true
myin(list,[2,2])?
    # false

我仔细检查了一下,不会那么容易的
ud = require 'underscore'
myin = (list, item)->
  ud.find(list,(x)->
    ud.isEqual(item,x))
myin(list,[0,0])
    # [ 0, 0 ]
myin(list,[0,3])
    # undefined
myin(list,[0,1])?
    # true
myin(list,[2,2])?
    # false