2013-04-16 91 views
-4

如何遍歷對象/數組並將所有函數轉換爲唯一的ID?javascript將所有函數轉換爲

升技像

JSON.stringify

但僅限於功能

Function.stringify(OBJ/ARR)

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時,他希望將每個函數編碼爲字符串唯一ID,而不是從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.stringifyreplacer

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解析+ stringify。 – Halcyon