2013-04-16 58 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