CoffeeScript' in'不像Python那样

时间:2014-05-13 15:49:31

标签: 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]]
>>> [0, 0] in lst
True
>>> [1, 0] in lst
True
>>> [0, 1] in lst
True
>>> [1, 1] in lst
False

我如何让CoffeeScript复制Python''对此?

2 个答案:

答案 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来比较item1list[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