2016-11-29 1 views
1

Я искал способ сделать это, но не могу найти ничего, у меня есть разные объекты конфигурации, которые мне нужно сохранить как текст в переменных для некоторых обработка позже, вот пример:JavaScript - Сохранить объект с помощью методов в виде строки

объект:

args.config.config = { 
     next: null, 
     final:[], 
     delimiter: '~', header: false, 
     step: function (row) { 
      var item = { 
       'line_code': row.data[0][0], 
       'order': row.data[0][1] 
      } 
      args.config.config.final.push(item); 
     }, 
     complete: function (result) { 
      console.log('Reading data completed. Processing.'); 
      return args.config.config.next(null, args.config.config.final); 
     }, 
     error: function() { 
      console.log('There was an error parsing'); 
     }' 
    } 

мне нужно сохранить это как строку, так что-то вроде:

args.config.config = "{object goes here}"; 

Не помещая все на одну гигантскую линию или добавляя символы линии прерывания, поскольку это будет проанализировано позже, чтобы использоваться в конфиге, и это испортит все идеи?

UPDATE: Так их изменения в текст не может быть лучшим решением, эти конфиги будут храниться в базе данных Монго, поэтому она может принимать их как есть (я не пробовал еще).

Одна из других проблем, я впадающих в том, что в объекте конфигурации у меня было так:

final.push(item) 

и

return next(null, final) 

, которые будут определены в другом файле с помощью объекта конфигурации:

другой файл:

exports.parse = function(args, next){//next is what I need to call in the config 

    var final = []; //this is the final referred to in the config object 
    .... 
    Baby.parse(data, args.config) 
} 

Итак, возвращение следующего (нулевого, окончательного) и final.push (результата) должно передать функцию var/в новом файле, но я понятия не имею, как заставить это работать, вот почему я пришлось добавить последний массив в объекте конфигурации и нуль следующей функции, а затем назначить его следующим образом:

exports.parse = function(args, next){ 
    args.config.next = next; 
    .... 
    Baby.parse(data, args.config) 
} 

объект звала его уродливой линии:

return args.config.config.next(null, args.config.config.final); 

Если кто-то имеет Кстати, это было бы очень признательно.

+0

Почему объекты должны быть текст для того, чтобы хранить для последующего использования? –

+0

Вы не можете из-за функций ... Можете ли вы сказать строки/числа в другом объекте и использовать функцию эти значения? – epascarello

+0

Термин для того, что вы хотите сделать, это «сериализовать». Существуют целые библиотеки, посвященные сериализации и десериализации объектов с помощью их методов. Наиболее распространенный подход - определить объект как экземпляр класса, сохранить имя класса как часть сериализации, а затем при десериализации восстановить экземпляр класса, возможно, используя понятие «фабрика классов», которая может создавать экземпляр объект, основанный на имени класса, вместе с его методами, из данных. –

ответ

2

Если вы используете JSON.stringify with a "replacer" function и JSON.parse with a "reviver" function вместе с new Function(), вы можете это сделать:

Я не уверен, что я после второго (обновлено) вопрос у вас есть. Как только объект анализируется обратно в объект, почему вы не можете просто инициализировать свойстваи final действительным объектам до вызова любого из методов объекта? Вы можете даже добавить тесты в этот метод, который проверяет наличие final и next перед возвратом чего-либо.

var myObj = { 
 
     next: null, 
 
     final:[], 
 
     delimiter: '~', 
 
     header: false, 
 
     step: function (row) { 
 
      var item = { 
 
       'line_code': row.data[0][0], 
 
       'order': row.data[0][1] 
 
      }; 
 
      args.config.config.final.push(item); 
 
     }, 
 
     complete: function (result) { 
 
      console.log('Reading data completed. Processing.'); 
 
      return args.config.config.next(null, args.config.config.final); 
 
     }, 
 
     error: function() { 
 
      console.log('There was an error parsing'); 
 
     } 
 
    }; 
 

 
// Stringify the object using a replacer function that will explicitly 
 
// turn functions into strings 
 
var myObjString = JSON.stringify(myObj, function(key, val) { 
 
     return (typeof val === 'function') ? '' + val : val; 
 
}); 
 

 
// Now, parse back into an object with a reviver function to 
 
// test for function values and create new functions from them: 
 
var obj = JSON.parse(myObjString, function(key, val){ 
 
    
 
    // Make sure the current value is not null (is a string) 
 
    // and that the first characters are "function" 
 
    if(typeof val === "string" && val.indexOf('function') === 0){ 
 

 
     // Isolate the argument names list 
 
     var start = val.indexOf("(") + 1; 
 
     var end = val.indexOf(")");  
 
     var argListString = val.substring(start,end).split(","); 
 
     
 
     // Isolate the body of the function 
 
     var body = val.substr(val.indexOf("{"), val.length - end + 1); 
 
     
 
     // Construct a new function using the argument names and body 
 
     // stored in the string: 
 
     return new Function(argListString, body); 
 
     
 
    } else { 
 
     // Non-function property, just return the value 
 
     return val; 
 
    } 
 
    } 
 
); 
 

 
// Test the method: 
 
obj.error(); // 'There was an error parsing' is written to console. 
 

 
// Examine the object: 
 
console.log(obj);

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