2013-06-08 3 views
3

У меня возникла проблема, когда я пытался получить доступ к свойству индекса глобального массива с помощью строки. Я динамически строку, которая выглядит примерно так:Доступ к массиву, содержащему свойства со строкой

var foo = "arr[0].prp[0].prp[1]"

Индекс в массиве, и как она глубока, является динамичным, и я просто предоставляя пример того, что она может выглядеть как.

Теперь проблема, когда я пытаюсь использовать эту строку, чтобы получить собственность, как это, он не:

foo.something, foo["something"], window[foo].something или window[foo]["something"]

Я могу однако использовать Eval(), чтобы заставить его работать, но я бы действительно хотел уйти, не используя его.

У кого-нибудь есть предложения или идеи?

+0

Первое, что пришло мне в голову, было оценено. – Johan

+1

Вот что такое eval для, на самом деле. Все еще интересно, как именно эта строка генерируется; превращение его в массив аксессуаров, по крайней мере, позволит разумные альтернативы. – raina77ow

+0

Почему у вас это в строке? Для чего это? – elclanrs

ответ

1

Использование eval может быть плохой идеей, поэтому я предоставлю альтернативное решение. Если вы указали, как генерируется строка, вы можете сохранить ее, чтобы ее разобрать и перезаписать генератор.

Вы строка генерироваться, которая выглядит как

var foo = "arr[0].prp[0].prp[1]"; 

Что произойдет, если вы используете некоторые RegExp как этот /\[\d+\]|\..*?(?=[\.\[])/ig?

var m = foo.match(/\[\d+\]|\..*?(?=[\.\[])|^.*?(?=[\.\[])/ig); 
// ["arr", "[0]", ".prp", "[0]", ".prp", "[1]"] 

Просто нужно немного больше синтаксический

m = m.map(function (e) { 
    if (e.charAt(0) === '.') return e.slice(1); 
    else if (e.charAt(0) === '[') return e.slice(1, -1); 
    else return e 
}); 
// ["arr", "0", "prp", "0", "prp", "1"] 

Теперь вы можете цикл над ним

var o = window, i; 
for (i = 0; i < m.length; ++i) { 
    o = o[m[i]]; 
} 
// o is now the result of window.arr[0].prp[0].prp[1] 
+0

Спасибо, вы и @flav предоставили мне несколько хороших идей о разборе моей строки. Боковое замечание, мне придется больше смотреть в регулярные выражения, так как я на самом деле нуб, когда дело доходит до них. – Brandon

1

*Live Demo *

var part = { 
    "arr": [ 
     { 
      "prp": [ 
       { 
        "prp": [ 
         "result" 
        ] 
       } 
      ] 
     } 
    ] 
}; 
var foo = "arr[0].prp[0].prp[0]"; 

function getValue(obj, chain) { 
    var keys = chain.split('\.'), 
     iterable = []; 
    for (var i = 0, len = keys.length; i < len; i++) { 
     var parts = keys[i].split('['); 
     parts[1] = parts[1].replace('\]', ''); 
     iterable.push(parts[0], parts[1]); 
    } 
    target = obj[iterable[0]]; 

    for (var j = 1, len = iterable.length; j < len; j++) { 
     target = target[iterable[j]]; 
    }; 
    return target; 
}; 
+0

Спасибо за предоставление демонстрации – Brandon

1

Еще один подход:

var obj = { 
     arr: [{ 
      prp: [{ 
       prp: ['a', 'b', 'c'] 
      }] 
     }] 
    }; 
    var foo = "arr[0].prp[0].prp[1]"; 

    var path = foo.replace(/\]/g, "").replace(/\[/g, ".").split('.').reverse(); 
    var res = obj; 
    while (path.length && res){ 
     var el = path.pop(); 
     res = res[el]; 
    } 

    console.log(res); 
Смежные вопросы