如何走一个对象/数组并将所有函数转换为唯一的ID?
abit like
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"]
}]
}
答案 0 :(得分: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);
以使“替换”功能可访问。
答案 1 :(得分: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"}
更改此代码以处理任意数量的函数非常容易。
这确实需要您知道所有功能,反序列化也是一个问题。
答案 2 :(得分: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');
}
答案 3 :(得分:0)
根据Frits的想法,我提出了自己的解决方案
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(){}]
}]
}));