【问题标题】:Searching object with recursive function in CoffeeScript在 CoffeeScript 中使用递归函数搜索对象
【发布时间】:2013-07-25 19:44:22
【问题描述】:

这是我在 StackOverflow 上的第一篇文章。问候!

我是一个学习 JavaScript 和 CoffeeScript 的绝对初学者程序员。

我正在编写一个递归函数来搜索一个对象,这只是一个学习练习。

我希望函数做什么:

  1. 向函数传递对象和项。
  2. 如果项目存在,则返回“已找到项目”。
  3. 如果项目不存在,则返回“未找到项目”。

目前在做什么:

  1. 向函数传递对象和项。
  2. 即使项目存在,它也会返回“未找到项目”。

这是我的 CoffeeScript:

meats =
        a: "chickens"
        b: "bacons"
        c: "hams"
        d: "salamis"
        e: "beefs"

meatSearch = (dict, key) ->
        if dict is key
        then console.log "found #{dict.item}"
        else if dict.sub
        then meatSearch dict.sub, key
        else console.log "item not found"

meatSearch meats, "b"

【问题讨论】:

    标签: javascript function search recursion coffeescript


    【解决方案1】:

    首先,我认为示例数据应该更具递归性。只有一层,很难递归

    second:不清楚为什么要搜索一个项目(即键值对)以及您期望的返回值是什么。因此,我稍微更改了您的示例以返回键上定义的值

    meats =
        a: "chickens"
        b: 
            b1: "bacon"
            b2: "Schinken"
            b3: "Sunka"
        s: 
            s1: "French Salami"
            s2: "Italian Salami"
        e: "beefs"
    
    search = (dict, key) ->
        #check if dict is not an object and return imediately
        return null if dict != Object(dict)
    
        #get value of key
        result = dict[key]
        # return value if key is found
        return result if result
    
        #else iterate over keys and call search recursively for the value
        for k of dict
            console.log "#{k}: #{dict[k]}"
            result = search dict[k], key
            # return as soon as something is found
            return result if result
    
        #return null if nothing found
        return null
    
        console.log search meats, "b3" #should return <<Sunka>>
    

    【讨论】:

    • 这很好!我从这段代码中得到一些奇怪的行为,它输出“a:鸡 b:[object] [object] Sunka”。我可以看到在您的示例中使用带有递归的 for 循环的原因。然而,我的目标是让代码以纯递归方式工作,并希望也能理解它。感谢您的精彩帖子,尽管它非常有帮助!
    • for循环中有一个console.log。你不能简单地删除它。您可以使用 Object.keys(dict).forEach 然后回调。然而,在 forEach 内部有一个循环,即使是最纯粹的函数式语言也在 ;-) 中使用迭代,而且 for 循环使您可以在找到匹配键后立即跳出循环。
    【解决方案2】:

    试试这样的事情怎么样[使用javascript,不是咖啡对不起]:

    var index = 0;
    var meats = {
        0:'chickens',
        1:'bacons',
        2:'hams',
        3:'salamis',
        4:'beefs'
    };
    
    searchMeats: function(object, item) {
        console.log(object,item);
        if (object[index] === item) {
            console.log('found ' + item);
        } else if (object[index+1]) {
            delete object[index];
            index = index + 1;
            searchMeats(object, item);
        } else {
            console.log('item not found');
        }
    };
    searchMeats(meats, "hams");
    

    它不是超级漂亮,但它使用了递归!

    【讨论】:

    • 谢谢!我将此代码转换为 CS link。 “delete object[index]”行的目的是什么?没有它,代码似乎可以工作。没有全局变量是否可以工作?
    • "delete" 行只是为了避免将同一个对象一直扔到下一轮递归中。它删除名称为“index”的值[删除项目 0 - 'chickens' 然后 1 - 'bacons']。所以是的,该函数无需删除即可工作,但没有它,它的递归性会降低!
    • 是的,它可以在没有全局变量 'index' 的情况下工作 - 我可能会将另一个变量传递给跟踪你所在索引的函数 - 因此使用 searchMeats(meats , "火腿", 0);这有意义吗?
    • 再次感谢您的帮助!我在这里有新代码link。现在只使用递归减少到 4 行! =)
    • Groovy,很高兴它有效!祝你的学习冒险好运!
    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 2011-10-02
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 2012-06-20
    • 2021-06-27
    • 2013-10-28
    相关资源
    最近更新 更多