2013-07-25 2 views
1

Это мой первый пост в StackOverflow. Приветствую!Поиск объекта с рекурсивной функцией в CoffeeScript

Я являюсь абсолютным программистом-новичком, изучающим 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" 

ответ

0

Как насчет попробовать что-то вроде этого [с помощью 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"); 

Это не супер красиво, но он использует рекурсию!

+0

Спасибо! Я преобразовал этот код в CS [link] (http://paste.ofcode.org/hrC5NNaS4qnj98t9A4TcHL). Какова цель строки «удалить объект [index]? Код работает без него. Возможно ли, чтобы это работало без глобальной переменной? – glowplug

+0

Линия« удалить »- это значит, что вы не продолжаете бросать один и тот же объект в следующий раунд рекурсивности. Он удаляет значение с именем «index» [удаляет элемент 0 - «цыплята», а затем 1 - «бекон»). Таким образом, да, функция работает без удаления, но без рекурсивных без нее ! –

+0

Да, это будет работать без глобальной переменной «index» - я бы, вероятно, передал другую переменную функции, которая отслеживает, на каком индексе вы находитесь, и, следовательно, начинайте рекурсию с помощью searchMeats (мясо, «ветчину», 0); Имеет ли это смысл? –

1

первую очередь я думаю, что пример данные должны быть более рекурсивным. Существует только один слой, и будет сложно recurse

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>> 
+0

Это очень хорошо! Я получаю какое-то странное поведение от этого кода, он выводит «a: цыплята b: [объект] [объект] Sunka». Я вижу причину использования цикла for с рекурсией в вашем примере. Моя цель, однако, состоит в том, чтобы заставить код работать с чисто рекурсией и, надеюсь, понять его. Спасибо за отличный пост, хотя это было очень полезно! – glowplug

+0

В контуре for есть консоль.log. вы не можете просто удалить это. Вы можете использовать Object.keys (dict) .forEach, а затем обратный вызов. Однако внутри внутри forEach есть петля, даже самый чистый функциональный язык использует итерацию внутри ;-) плюс цикл for дает вам возможность выйти из цикла, как только вы найдете соответствующий ключ. – robkuz

Смежные вопросы