2013-04-16 4 views
-4

Как я могу пройти объект/массив и преобразовать все функции в уникальный идентификатор?javascript преобразовать все функции

ABIT как

JSON.stringify

но только для функций

Function.stringify (объект/обр)

var sum = function(a,b){return a+b} 

Function.stringify({ 
    foo: sum, 
    bar: [{ 
     baz: [["foo", "bar"], "baz", function(){}] 
    }] 
}) 

// returns 

{ 
    foo: "func01", 
    bar: [{ 
     baz: [["foo", "bar"], "baz", "func02"] 
    }] 
} 
+6

Что именно вопрос? – Snuffleupagus

+1

Ваш вопрос довольно неясен. – SLaks

+2

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

ответ

2

что-то вроде следующего, хотя я и не заморачиваться с прокладкой для функции счетчика:

var mySerializer = function() { 
    var counter = 0; 

    return function serialize(input, stack, reset) { 
    var result, prop, funcId, i; 

    if (reset) { 
     counter = 0; 
    } 

    if (typeof stack !== 'object') { 
     stack = {}; 
    } 

    switch (typeof input) { 
     // input is object 
     case 'object': 
     result = {}; 
     for (prop in input) { 
      if (input.hasOwnProperty(prop)) { 
      result[prop] = serialize(input[prop], stack, false); 
      } 
     } 
     break; 

     // input is array 
     case 'array': 
     result = []; 
     for (i = 0; i < input.length; i += 1) { 
      result.push(serialize(input[i], stack, false)); 
     } 
     break; 

     case 'function': 
     funcId = ['func', ++counter].join(''); 
     funcs[funcId] = input; 
     return funcId; 

     // default 
     default: 
     return input; 
    } 

    return result; 
    }; 
}(); 

var 
    sum = function(a,b){ return a+b; }, 
    funcs = {}, 
    result = mySerializer({ 
    foo: sum, 
    bar: [{ 
     baz: [["foo", "bar"], "baz", function(){}] 
    }] 
    }, funcs); // supply empty object, which will be used to stored replaced functions 

console.log(result, funcs); 

демо: http://jsbin.com/ujahub/1/


обновляется, чтобы сделать «заменены» функции доступны ,

+0

Спасибо! Я также сделал свою собственную душевную реакцию с помощью JSON http://jsfiddle.net/gHMU4/1 – Endless

+1

@Endless: Серьезно, не используйте это решение. Не нужно «.stringify», а затем '.parse'. Вы основали его на плохом решении, которое делало неправильные предположения о вашем вопросе. Простая рекурсивная функция - это все, что вам нужно. – 2013-04-16 16:19:48

1

Вы можете использовать второй аргумент до JSON.stringify: replacer:

function func() {} 
var data = { 
    "some data": func 
}; 
JSON.stringify(data, function (key, value) { 
    if (value === func) { 
     return "**func"; 
    } 
    return value; 
}); 
// output: {"some data": "**func"} 

Весьма легко изменить этот код для обработки произвольного количества функций.

Это требует от вас знаю все ваши функции и де-сериализация также является проблемой.

0

Просто для удовольствия ...

function getAllFunctions() 
{ 
    var functionBodies = []; 

    //iterate through keys of window object 
    for (var f in window) 
    { 
     if (window.hasOwnProperty(f) && typeof window[f] === 'function') 
     { 
      //ignore native functions 
      if(window[f].toString().match(/(\[native code\]|\[object Function\])/g) == null) 
      { 
       functionBodies.push(window[f].toString()); 
      } 
     } 
    } 

    return functionBodies.join('\n\n'); 
} 
0

с идеей от Фриц я пришел с моим собственным решением

var id = 0; 
func = {}; 

function mySerializer(data){ 
    return JSON.parse(JSON.stringify(data, function (key, value) { 
     if (typeof value === "function") { 
      func["func"+id] = value; 
      id++; 
      return "func"+id; 
     } 
     return value; 
    })); 
} 

var sum = function(a,b){ return a+b; }; 

console.log(mySerializer({ 
    foo: sum, 
    bar: [{ 
     baz: [["foo", "bar"], "baz", function(){}] 
    }] 
})); 
+0

Как вы собираетесь справиться с де-сериализацией? или вы просто хотите избавиться от функций? – Halcyon

+0

Поскольку вы четко указываете в своем вопросе, что все, что вы хотите сделать, влияет на функции вашего объекта, почему вы используете '.serialize' и' .parse'? Это, по-видимому, серьезный перебор. – 2013-04-16 16:21:11

+0

'stringify' ходит по структуре для вас, конечно же, нет тривиальной вещи в JavaScript (@cvsguimaraes ошибался). Разбор JSON быстро ускоряется в JavaScript. Вы хотели бы стать эталоном? Пользовательский ходок + замена vs parse + stringify. – Halcyon