Я не хочу давать ответ без профилирования кода сам, но, учитывая, что eval
, вероятно, медленный, а forEach
медленнее, чем просто выполнение цикла for, я бы начал с:
// precondtion: path is a nonempty string
function getNested(obj, path) {
var fields = path.split(".");
var result = obj;
for (var i = 0, n = fields.length; i < n; i++) {
result = result[fields[i]];
}
return result;
}
Но я бы протестировал это на других подходах.
Я не думаю, что попытка оптимизировать конструкцию массива на split
была бы полезной, но это только одна вещь, которую вы можете попробовать, если вызаинтересованы в самом быстром способе.
ADDENDUM
Вот расшифровка, так что вы можете увидеть ее в действии:
$ node
> function getNested(obj, path) {
... var fields = path.split(".");
... var result = obj;
... for (var i = 0, n = fields.length; i < n; i++) {
... result = result[fields[i]];
... }
... return result;
... }
> var o = { a: { b: { c: 1 } } };
> getNested(o, "a")
{ b: { c: 1 } }
> getNested(o, "a.b.c")
1
** ADDENDUM 2 **
Так стыдно - я забыл var
перед result
раньше.Это может немного ускорить процесс!
Другие вещи, которые можно попробовать:
- Забудьте об «оптимизации» с помощью
n
и просто выполните тест цикла for с помощью i < test.length
(в любом случае может быть оптимизирован) - Замените разделение на
substring
s и indexOf
s - Выполните разделение с помощью регулярного выражения
/\./
вместо необработанной строки "."