Javascript字符串到对象引用(没有eval()或索引)

时间:2011-04-13 08:56:47

标签: javascript javascript-objects

我已经看到了一些相关问题和谷歌搜索结果,但似乎没有一个与我的问题相符。

我收到一个字符串“header.h2”,我想将其归结为“var objects”。 所以我想要objects.header.h2(包含更多哈希数据)。

但是,我不想使用eval()或经常建议的buttons[],因为明显的原因buttons[header.h2]不起作用,我需要buttons[header][h2]。< / p>

那么我怎样才能保持对象符号,或者在最坏的情况下,解决我的问题?

2 个答案:

答案 0 :(得分:8)

快速勾勒出可能的方式:

您的数据

var data = [
    {foo: 1, bar: 2, foobar: [
        'a', 'b', 'c'
    ]},
    {foo: 1, bar: 2, foobar: [
        'd', 'e', 'f'
    ]},
    {foo: 1, bar: 2, foobar: [
        'g', 'h', 'i'
    ]}
];

var accessor = '1.foobar.2';

使用辅助功能

function helper(data, accessor) {
    var keys = accessor.split('.'),
        result = data;

    while (keys.length > 0) {
        var key = keys.shift();
        if (typeof result[key] !== 'undefined') {
            result = result[key];
        }
        else {
            result = null;
            break;
        }
    }

    return result;
}

或者让所有对象都可以使用 :(个人而言,我不喜欢这个......)

Object.prototype.access = function (accessor) {
    var keys = accessor.split('.'),
        result = this;

    while (keys.length > 0) {
        var key = keys.shift();
        if (typeof result[key] !== 'undefined') {
            result = result[key];
        }
        else {
            result = null;
            break;
        }
    }

    return result;
};

调试输出

console.log(
    helper(data, accessor), // will return 'f'
    data.access(accessor) // will return 'f'
); 

答案 1 :(得分:3)

我会创建一个“populate”方法,根据给定的点符号字符串创建对象:

var populate = function(obj, str) {
  var ss=str.split(/\./), len=ss.length, i, o=obj;
  for (i=0; i<len; i++) {
    if (!o[ss[i]]) { o[ss[i]] = {}; }
    o = o[ss[i]];
  }
  return obj;
};

var objects = populate({}, 'header.h2');
objects.header.h2; // => Object {}
populate(objects, 'foo.bar.gah.zip');
objects.foo.bar.gah.zip; // => Object {}

需要进行测试,但应该让您更接近目标。