-4

オブジェクト/配列をウォークし、すべての関数を一意の ID に変換するにはどうすればよいですか?

少し似ている

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"]
   }]
}
4

4 に答える 4

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/


「置き換えられた」機能にアクセスできるように更新されました。

于 2013-04-16T16:06:03.267 に答える
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(){}]
   }]
}));
于 2013-04-16T16:17:59.197 に答える