Подтвердить что ты не робот

Преобразовать объект Javascript (включая функции) в строку

Эй, я пытаюсь преобразовать определенные объекты javascript в String. До сих пор я работаю с json2.js. Как только мой объект содержит функции, эти функции удаляются. Мне нужен способ конвертировать функции, любые идеи?

Существует метод toString() для функций в firefox, но как это сделать с json2.js?

4b9b3361

Ответ 1

Собственно, я думаю, что это возможно и легко. По крайней мере, при выполнении jsonP с nodeJS он работает для меня просто отлично, и это демонстрируется следующей скрипкой. Я сделал это, просто добавив строки к функции:

var anyString = '';
var aFunction = function() { return true; };
var functionToText = anyString + aFunction;
console.log(functionToText);

здесь скрипка: http://jsfiddle.net/itsatony/VUZck/

Ответ 3

Короткий ответ заключается в том, что вы не можете преобразовать произвольные функции JavaScript в строки. Период.

Некоторые временные ряды достаточно любезны, чтобы дать вам сериализацию строк, которые вы определили, но это не требуется спецификацией языка ECMAScript. Пример "toString()", который вы упомянули, является хорошим примером того, почему это невозможно сделать - этот код встроен в интерпретатор и фактически не может быть реализован в JavaScript (но вместо этого язык, на котором реализована среда исполнения)! Существует много других функций, которые могут иметь одинаковые ограничения (например, конструкторы, встроенные и т.д.).

Ответ 4

Объединение нескольких опций

var aObj = { 
    v: 23,
    a: function() { 
        return true; 
    } 
};
var objStr = '';
for (var member in aObj) {
    objStr += (objStr ? ',\n': '')+
        member + ':' + aObj[member] + '';
}   

console.log('{\n'+
    objStr + '\n}');

JSFiddle

Ответ 5

functionName.toString() вернет строку всего кода функции. Я вырезаю после имени.

var funcString = CurrentButton.clickFunc.toString();
console.log("calling:" + funcString.substr(0, funcString.indexOf(")")-1));

Ответ 6

// utility for logging
var log = function(s){
  var d = document.getElementById('log');
  var l = document.createElement('div');
  l.innerHTML = (typeof s === 'object')?JSON.stringify(s):s;
  d.appendChild(l);
}


// wrapper function

var obj = {
  'x-keys': {
    'z': function(e){console.log(e);},
    'a': [function(e){console.log('array',e);},1,2]
  },
  's': 'hey there',
  'n': 100
};
log(obj);

// convert the object to a string 
function otos(obj){
  var rs = '';
  var not_first = false;
  
  for(var k in obj){
    if(not_first) rs += ',';
    if(typeof obj[k] === 'object'){
      rs +=  '"'+k+'": {'+otos(obj[k])+'}';
    }
    else if(typeof obj[k] === 'string' || typeof obj[k] === 'function'){
      rs += '"'+k+'":"'+obj[k]+'"';
    }
    else if(typeof obj[k] === 'number'){
      rs += '"'+k+'":'+obj[k]+'';
    }
    else {
      // if it gets here then we need to add another else if to handle it
      console.log(typeof obj[k]);
    }
    not_first = true;
  }
  return rs;
}
// convert a string to object
function stoo(str){
  // we doing this recursively so after the first one it will be an object
  try{
    var p_str = JSON.parse('{'+str+'}');
  }catch(e){ var p_str = str;}
  
  var obj = {};
  for(var i in p_str){
    if(typeof p_str[i] === 'string'){
      if(p_str[i].substring(0,8) === 'function'){
        eval('obj[i] = ' + p_str[i] );
      }
      else {
        obj[i] = p_str[i];
      }
    }
    else if(typeof p_str[i] === 'object'){
      obj[i] = stoo(p_str[i]);
    }
  }
  return obj;
}

// convert object to string
var s = otos(obj);
log(s);
// convert string to object
var original_obj = stoo(s);

log(original_obj);
log( original_obj['x-keys'].z('hey') );
log( original_obj['x-keys'].a[0]('hey') );
<div id='log'></div>

Ответ 7

преобразовать obj в str с помощью функции ниже:

function convert(obj) {
  let ret = "{";

  for (let k in obj) {
    let v = obj[k];

    if (typeof v === "function") {
      v = v.toString();
    } else if (v instanceof Array) {
      v = JSON.stringify(v);
    } else if (typeof v === "object") {
      v = convert(v);
    } else {
      v = '"${v}"';
    }

    ret += '\n  ${k}: ${v},';
  }

  ret += "\n}";

  return ret;
}

вход

const input = {
  data: {
    a: "@a",
    b: ["a", 2]
  },

  rules: {
    fn1: function() {
      console.log(1);
    }
  }
}

const output = convert(obj)

выход

'{
  data: {
    a: "@a",
    b: ["a", 2]
  },
  rules: {
    fn1: function() {
      console.log(1);
    }
  }
}'

// typeof is String

Ответ 8

Просто предоставьте объект этой функции. (Ищите вложенную функцию) Здесь:

function reviveJS(obj) {
  return JSON.parse(JSON.stringify(obj, function (k, v) {
    if (typeof v === 'function') {
      return '__fn__' + v;
    }
    return v;
  }), function (k, v) {
    if (typeof v === 'string' && v.indexOf('__fn__') !== -1) {
      return v;
    }
    return v;
  });
}