jquery — доступ к вложенным объектам JavaScript с помощью строкового ключа

Доступ к вложенным объектам JavaScript с помощью строкового ключа

Здесь я предлагаю больше способов, которые кажутся более быстрыми во многих отношениях:

Вариант 1: разделить строку на. или [или] или ‘или «, переверните его, пропустите пустые элементы.

 function getValue(path, origin) { if (origin === void 0 || origin === null) origin = self ? self : this; if (typeof path !== 'string') path = ''   path; var parts = path.split(/[|]|.|'|"/g).reverse(), name; // (why reverse? because it's usually faster to pop off the end of an array) while (parts.length) { name=parts.pop(); if (name) origin=origin[name]; } return origin; } 

Вариант 2 (самый быстрый из всех, кроме eval ): низкоуровневое сканирование символов (без регулярных выражений / split / etc, просто быстрое сканирование символов). Примечание: этот не поддерживает кавычки для индексов.

 function getValue(path, origin) { if (origin === void 0 || origin === null) origin = self ? self : this; if (typeof path !== 'string') path = ''   path; var c = '', pc, i = 0, n = path.length, name = ''; if (n) while (i{amp}lt;=n) ((c = path[i  ]) == '.' || c == '[' || c == ']' || c == void 0) ? (name?(origin = origin[name], name = ''):(pc=='.'||pc=='['||pc==']'{amp}amp;{amp}amp;c==']'?i=n 2:void 0),pc=c) : name  = c; if (i==n 2) throw "Invalid path: " path; return origin; } // (around 1,000,000 /- ops/sec) 

Вариант 3: ( новый : расширен вариант 2 для поддержки кавычек — немного медленнее, но все же быстро)

 function getValue(path, origin) { if (origin === void 0 || origin === null) origin = self ? self : this; if (typeof path !== 'string') path = ''   path; var c, pc, i = 0, n = path.length, name = '', q; while (i{amp}lt;=n) ((c = path[i  ]) == '.' || c == '[' || c == ']' || c == "'" || c == '"' || c == void 0) ? (c==q{amp}amp;{amp}amp;path[i]==']'?q='':q?name =c:name?(origin?origin=origin[name]:i=n 2,name='') : (pc=='['{amp}amp;{amp}amp;(c=='"'||c=="'")?q=c:pc=='.'||pc=='['||pc==']'{amp}amp;{amp}amp;c==']'||pc=='"'||pc=="'"?i=n 2:void 0), pc=c) : name  = c; if (i==n 2 || name) throw "Invalid path: " path; return origin; } 

JSPerf: http://jsperf.com/ways-to-dereference-a-delimited-property-string/3

«eval (…)» все еще король (хотя производительность). Если у вас есть пути к свойствам непосредственно под вашим контролем, не должно быть никаких проблем с использованием ‘eval’ (особенно, если требуется скорость). Если перетаскивать пути свойств «по проводу» ( на линию !? Lol: P), тогда да, используйте что-то еще, чтобы быть в безопасности. Только идиот сказал бы, что никогда не должен использовать «eval», так как есть веские причины, чтобы его использовать. Кроме того, «Он используется в JSON-парсере Дуга Крокфорда» . Если вход безопасен, то никаких проблем нет. Используйте правильный инструмент для правильной работы, вот и все.

§

У меня есть такая структура данных:

 var someObject = { 'part1' : { 'name': 'Part 1', 'size': '20', 'qty' : '50' }, 'part2' : { 'name': 'Part 2', 'size': '15', 'qty' : '60' }, 'part3' : [ { 'name': 'Part 3A', 'size': '10', 'qty' : '20' }, { 'name': 'Part 3B', 'size': '5', 'qty' : '20' }, { 'name': 'Part 3C', 'size': '7.5', 'qty' : '20' } ] }; 

И я хотел бы получить доступ к данным с помощью этих переменных:

 var part1name = "part1.name"; var part2quantity = "part2.qty"; var part3name1 = "part3[0].name"; 

part1name должно быть заполнено значением someObject.part1.name , которое является «Часть 1». То же самое с part2quantity, который заполнен 60.

Есть ли способ достичь этого с помощью чистого JavaScript или JQuery?

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector