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]]
>>> [0, 0] in lst
True
>>> [1, 0] in lst
True
>>> [0, 1] in lst
True
>>> [1, 1] in lst
False
我如何让CoffeeScript复制Python''对此?
答案 0 :(得分:2)
它确实以你想要的方式工作,但它的参考:
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
要通过深度检查而不是引用来使其工作,您必须分叉咖啡脚本编译器,将此功能添加到咖啡脚本语言,然后提交拉取请求,说服看门人这是一个很好的功能并希望他们将其合并。
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
答案 1 :(得分:1)
Coffeescript将item1 in list
翻译为(忽略处理没有indexOf
的浏览器的补丁):
list.indexOf(item1) >= 0;
因此它受Javascript代码indexOf
的限制。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
indexOf使用严格相等(使用===或三等号运算符使用的相同方法)将searchElement与Array的元素进行比较。
这大致相当于使用is
来比较item1
和list[i]
的Python列表搜索。比较这两个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才是真的。
underscore
实现了深度比较:
isEqual_.isEqual(object,other) 在两个对象之间执行优化的深度比较,以确定它们是否应被视为相等。
使用它我可以定义一个函数,如果找到则返回该项,如果不是,则返回undefined
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