通过循环coffeescript中的对象来动态地字符串函数调用

通过循环coffeescript中的对象来动态地字符串函数调用,coffeescript,Coffeescript,这与一个不同的图像编辑库(而不是Pixastic)有着松散的联系,代码也进行了一些重构 我正在尝试编写一个函数changify,将HTML5图像画布恢复到其原始状态,然后对其运行一些预设更改。此代码从名为camanCache的列表中加载右画布元素imageClipName,其工作原理如下: changify = (imageClipName) -> camanCache[imageClipName].revert -> camanCache[imageClip

这与一个不同的图像编辑库(而不是Pixastic)有着松散的联系,代码也进行了一些重构

我正在尝试编写一个函数
changify
,将HTML5图像画布恢复到其原始状态,然后对其运行一些预设更改。此代码从名为
camanCache
的列表中加载右画布元素
imageClipName
,其工作原理如下:

changify = (imageClipName) ->
    camanCache[imageClipName].revert ->
        camanCache[imageClipName]
            .brightness(10)
            .contrast(10)
            .noise(10)
            .render()
    console.log(camanCache[imageClipName])
但我想从另一个名为
imageValues
的列表中找到保存的预设更改,并从该列表的键值对中动态创建图像函数更改字符串。以下是我试图做的,但失败了:

imageClipName = "image_1"
imageValues = {image_1:{brightness: 10, contrast: 10, noise: 10}, image_2:{...}...}

changify = (imageClipName) ->
    camanCache[imageClipName].revert ->
        camanCache[imageClipName]
            for o in imageValues when o.id == imageClipName
                for key, val of o
                    .#{key}(val)
            .render()

这给了我一个
changify
函数第三行的coffeescript语法错误(
意外的'INDENT'
),但我怀疑
{key}(val)
在将多个函数附加到
camanCache[imageClipName]
时不起作用。如何在coffeescript中动态字符串化函数调用?

我认为您正在尝试这样做:

changify = (imageClipName) ->
    camanCache[imageClipName].revert -> 
        clip = camanCache[imageClipName]
        for id, methods of imageValues when id == imageClipName
            for name, arg of methods
                clip = clip[name](arg)
            clip.render()
注意切换到<代码>以。。。在外部循环中的,因为您正在对对象进行迭代,
用于。。。in
用于CoffeeScript中的数组

鉴于此:

{brightness: 10, contrast: 10, noise: 10}
方法中
,此循环:

clip = camanCache[imageClipName]
for name, arg of methods
    clip = clip[name](arg)
clip.render()
将产生与以下相同的效果:

camanCache[imageClipName].brightness(10).contrast(10).noise(10).render()
在对象
o
上迭代时,
键、val
对的顺序没有定义,因此不能保证
亮度
对比度
噪声
调用的顺序。如果您需要按特定顺序使用它们,则必须为
方法使用数组:

imageValues = {image_1: [['brightness', 10], ['contrast', 10], ['noise', 10]], ... }

changify = (imageClipName) ->
    camanCache[imageClipName].revert -> 
        clip = camanCache[imageClipName]
        for id, methods of imageValues when id == imageClipName
            for method in methods
                clip = clip[method[0]](method[1])
            clip.render()
或者更好一点:

imageValues = {image_1: [ {name: 'brightness', arg: 10}, {name: 'contrast', arg: 10}, {name: 'noise', arg: 10}], ... }

changify = (imageClipName) ->
    camanCache[imageClipName].revert -> 
        clip = camanCache[imageClipName]
        for id, methods of imageValues when id == imageClipName
            for method in methods
                clip = clip[method.name](method.arg)
            clip.render()

哇,关于未定义的迭代顺序的非常有用的信息。迭代的顺序是javascript遗留下来的,还是coffeescript所独有的?@Michael:这是直接的javascript,这里有一些指向规范相关部分的链接。键/值存储很少有定义的顺序,Ruby 1.9的哈希是我遇到的唯一顺序键/值对象。再次感谢。显然,我对Ruby有点着迷:)