2015-05-29 2 views
0

У меня есть проект, который требует от меня преобразовать объект в строку без использования stringify. Целью этого является реализация рекурсивной функции, которая преобразует объект в строку. Кажется, у меня есть 2 проблемы:Реализация рекурсивной функции, которая преобразует объект в строку в javascript

1) Моя функция для вывода объекта как строки, кажется, выводит первое значение, а не остальное.

function myToString(argObj) { 
    var str = ""; 
    for (var val in argObj) { 
     if (argObj.hasOwnProperty(val)) { 
      str += val + " : " + argObj[val] + "\n"; 
      console.log(str); 
     } 
     return str; 
    } 
} 

2) Мое понимание выше в цикле, будет то, что он будет печатать каждый ключ/значение пары в объекте, но это только делает это в первый ключ/значение. Используя рекурсию, как я могу заставить это работать над каждой парой ключ/значение.

+1

Одна из первых вещей, которые нужно изменить - это избавиться от 'document.write()'. Если вы хотите отслеживать выполнение кода, используйте 'console.log()', который записывается в консоль разработчика. – Pointy

+1

Оператор возврата должен быть перенесен в последнюю строку. В противном случае он запускается только один раз для инструкции for. – ybdesire

+1

Не успел бы заняться отладчиком эй? –

ответ

2

У вас было возвращаемое значение внутри цикла for, то есть оно возвращалось на первую итерацию через него. Попробуйте это:

function myToString(argObj) { 
    var str = ""; 
    for (var val in argObj) { 
     if (argObj.hasOwnProperty(val)) { 
      str += val + " : " + argObj[val] + "\n"; 
      document.write(str); 
     } 
    } 
    return str; 
} 

После этого вы хотите знать, если какой-либо из свойств argObj являются объектами, так что вы можете рекурсивно вызвать функцию на любом из них. Из этого SO post возьмите функцию, чтобы проверить, является ли переменная объектом. Вероятно, вы не хотите включать массивы в свой рекурсивный вызов. Возможно, вы захотите распечатать их содержимое. (Но это уже другой вопрос эй) Тогда ваш код становится чем-то вроде этого:

function myAndSomeGuyOnStackOverflowToString(argObj) { 
    var str = ""; 
    for (var val in argObj) { 
     if (argObj.hasOwnProperty(val)) { 
      var propertyValue = argObj[val]; 
      if (isAnObject(propertyValue)){ 
       propertyValue = myAndSomeGuyOnStackOverflowToString(propertyValue) 
      } 
      str += val + " : " + propertyValue + "\n"; 
      document.write(str); 
     } 
    } 
    return str; 
} 

function isAnObject(objArg){ 
    //choose your implementation from the many on that other post I mentioned 
} 

И с некоторым отступом и строками форматирования, вы должны быть хорошо на вашем пути.

+0

Спасибо, ребята, это сработало для меня. Вы знаете, как я могу сделать это в рекурсивную функцию, используя переданный объект? Я перешел через множество рекурсивных примеров в Интернете, но не вижу никого, что бы покрывало что-то вроде этого. –

+0

попробуйте это редактирование ..... –

0
function myToString(argObj, res) { 

    if (argObj !== null && typeof argObj === "object") { 
     for (var val in argObj)  
      res += val + " : " + argObj[val] + "\n"; 
    } 

    if (typeof argObj === "number" || typeof argObj === "string") 
     return res + argObj; 

    return res; 
} 

Вызвать эту функцию, вызвав myToString(object, ""), она возвращает строку. Надеюсь, он может помочь вам или дать вам некоторое представление, чтобы написать его рекурсивно.

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