4

I've seen quite some related questions and google results, but none seem to match my problem.

I'm getting a string "header.h2" which I want to contencate to 'var objects'. So I want objects.header.h2 (which contains more hash data).

However, I don't want to use eval() or the often suggested buttons[] for the obvious reason that buttons[header.h2] won't work and I would need buttons[header][h2].

So how can I remain the object notation, or in the worst case, solve my problem?

2 Answers 2

8

Just a quick sketch of a possible way:

Your data:

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';

Using a helper function:

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;
}

Or making it available to all objects: (personally, I don't like this...)

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;
};

Debug output:

console.log(
    helper(data, accessor), // will return 'f'
    data.access(accessor) // will return 'f'
); 
Sign up to request clarification or add additional context in comments.

1 Comment

So splitting on the dot and then iterating through them and set them in an multi-dimensional array? Looks good!
3

I would create a "populate" method which creates the object per the dot notation string it is given:

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 {}

Needs testing but should get you closer to your goal.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.