Advertisement
Guest User

Untitled

a guest
Feb 13th, 2016
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.12 KB | None | 0 0
  1. function compile(selector) {
  2.  
  3. function identity(x) {
  4. return x
  5. }
  6.  
  7. function compose(f, access) {
  8. return function(x) {
  9. let r = f(x)
  10. if (r && access in r) return r[access]
  11. else return null
  12. }
  13. }
  14.  
  15. let f = identity
  16.  
  17. let readingFieldAccess = false
  18. let readingArrayAccess = false
  19. let fieldName = ''
  20. let arrayIndex = ''
  21. let escaped = false
  22. for (let c of (selector + '.')) {
  23. if (readingFieldAccess && readingArrayAccess) {
  24. throw new Error('Illegal state!');
  25. } else if (readingFieldAccess) {
  26. if (c == '\\' && !escaped) {
  27. escaped = true
  28. } else if ((c == '[' || c == '.') && !escaped) {
  29. if (fieldName == '') throw new Error('Empty field name')
  30. f = compose(f, fieldName)
  31. fieldName = ''
  32. readingFieldAccess = c != '['
  33. readingArrayAccess = c == '['
  34. } else {
  35. escaped = false
  36. fieldName += c
  37. }
  38. } else if (readingArrayAccess) {
  39. if (c == ']') {
  40. if (arrayIndex == '') throw new Error('Empty array index')
  41. f = compose(f, parseInt(arrayIndex))
  42. arrayIndex = ''
  43. readingFieldAccess = false
  44. readingArrayAccess = false
  45. } else if (/\d/.test(c)) {
  46. arrayIndex += c
  47. } else {
  48. throw new Error('Illegal array index!')
  49. }
  50. } else if (!readingFieldAccess && !readingArrayAccess) {
  51. if (c == '.') readingFieldAccess = true
  52. else if (c == '[') readingArrayAccess = true
  53. else throw new Error('Invalid expression!')
  54. }
  55. }
  56.  
  57. return f
  58. }
  59.  
  60. let obj = {
  61. passengers: [
  62. {
  63. flights: [
  64. {
  65. segments: [
  66. {
  67. services: {
  68. seat: {
  69. number: '1A'
  70. }
  71. }
  72. },
  73. {
  74. services: {
  75. seat: {
  76. number: '2A'
  77. }
  78. }
  79. }
  80. ]
  81. }
  82. ]
  83. }
  84. ]
  85. }
  86.  
  87. function t(selector, obj) {
  88. let compiled = compile(selector)
  89. console.log(selector, obj, compiled, compiled(obj))
  90. }
  91.  
  92. t('.passengers[0].flights[0].segments[1].services.seat.number', obj)
  93. t('.passengerss.bla', obj)
  94. t('.', obj)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement