-2

由于某种原因,我在 JS 中有必须硬编码的函数。如何制作一个编写这个硬编码函数的函数?这是我的例子;假设 obj 是一个多数组/JSON 对象:

function foo2(obj) {
    var t = obj["key1"];
    t = t["key2"];
    return t;
}

function fooN(obj) {
    var t = obj["key1"];
    t = t["key2"];
    ...//more goes here
    t = t["keyN"];
    return t;
}

我知道有更简单的方法可以访问多数组/对象,但是像这样的硬编码函数是迄今为止最快的,因为没有变量替换。谢谢你。

4

2 回答 2

1

我不提倡这样做,但您可以这样做:

function defineAccessor(propArray) {
  var accessors = propArray.join('.');
  return new Function('obj', 'return obj.' + accessors);
}
var x = { key1: { key2: 3 } };
var foo2 = defineAccessor(['key1', 'key2']);
alert(foo2(x)); // alerts 3

于 2015-05-01T04:16:06.330 回答
0

似乎有些奇怪的要求,但一个可能的解决方案是将功能添加到windowusing window['foo' + number].

此解决方案中的主要棘手部分是中间的闭包,以确保使用正确的值i。这是通过调用一个i以 arg 为参数并返回一个函数的函数来完成的。

var N = 5;

fooX = function(obj, x) {
  var t = obj["key" + 1];
  for (var i = 2; i <= x; i++) {
    t = t["key" + i];
  }
  return t;
}

for (var i = 1; i <= N; i++) {
  window['foo' + i] = (function(x) {
    return function(obj) {
      return fooX(obj, x);
    }
  })(i);
}


var obj = {
  key1: {
    key2: {
      key3: {
        key4: {
          key5: 5
        }
      }
    }
  }
}

var message = "Results:<br>" +
  "foo1(obj) = " + foo1(obj) + "<br>" +
  "foo2(obj) = " + foo2(obj) + "<br>" +
  "foo3(obj) = " + foo3(obj) + "<br>" +
  "foo4(obj) = " + foo4(obj) + "<br>" +
  "foo5(obj) = " + foo5(obj);

document.body.innerHTML = message;

于 2015-05-01T04:18:15.300 回答