Javascript JSON对象表示的jQuery选择器

Javascript JSON对象表示的jQuery选择器,javascript,jquery,json,regex,object,Javascript,Jquery,Json,Regex,Object,我感兴趣的是获取一个jQuery选择器字符串(您放入$())并从中生成一个包含字符串中指定的所有元素的JSON对象我对从DOM中选择不感兴趣 这种事情必须在jQuery的引擎盖下发生,我是否可以使用公共函数来实现这一点?是否有提供此功能的开源库 给定以下输入字符串: 输入[class=wood][name=cedar] 输入[class='wood'][name='cedar'] 输入[class=“wood”][name=“cedar”] 我想返回以下输出: { [ eleme

我感兴趣的是获取一个jQuery选择器字符串(您放入
$()
)并从中生成一个包含字符串中指定的所有元素的JSON对象我对从DOM中选择不感兴趣

这种事情必须在jQuery的引擎盖下发生,我是否可以使用公共函数来实现这一点?是否有提供此功能的开源库

给定以下输入字符串:

  • 输入[class=wood][name=cedar]
  • 输入[class='wood'][name='cedar']
  • 输入[class=“wood”][name=“cedar”]
我想返回以下输出:

{
  [
    elementType: 'input',
    attributes: [
      class: 'wood',
      name: 'cedar'
    ]
  ]
}
并给出以下字符串:

  • 输入,div
  • 输入,div
我想:

{
  [
    elementType: 'input'
  ],
  [
    elementType: 'div'
  ]
}
这是一个相当复杂的正则表达式,如果我必须自己编写它,而且我不想重新发明轮子:)

当然,可以做到:

var query = $("input, div")
var selector = [];

query.selector.split(',').forEach(function(element){
 selector.push({"element": element})
});

console.log(selector)
将为您提供:

[
  {
    elementType: 'input'
  },
  {
    elementType: 'div'
  }
]
这是一张工作票

工作原理:


您可以检查任何jQuery选择器对象,您将发现一个名为
selector
的属性。这是查询的字符串表示形式。只要为您需要的JSON结构提供正确的解析器,就完成了

这里是元素和属性支持,完整的jQuery选择器语法将使这一点更加复杂

下面是正在运行的代码的jsBin


您始终可以创建内存中的HTML元素。该元素是一个具有属性和值的HtmleElement对象。你可以说
this.food=“soup”
等等,但是你必须自己构建它。但是我希望你意识到
type>wood
food>soup
都是无效的元素属性。这就是为什么我指定我不是从DOM中选择的。就本例而言,这并不重要。如果您喜欢@RokoC.Buljan,我可以在属性前面抛出
数据-
。我想您可能在问XY问题。你到底在干什么?我想问的是,如果你解释一下你想做什么,可能有比你最初认为最好的解决方案更好的解决方案。@RokoC.Buljan这不是XY问题。我想使用现有的jQuery选择器语法创建一些全新的东西。谢谢,但这不是我想要的。我或多或少需要一整套jQuery选择器,就像您在这里看到的单个元素一样,但我还需要属性选择器,在我问题的第一个示例中。这是一个更难编写的正则表达式。我从
+\[(.+)\]
开始,意识到我不想从头开始发明整个东西。
var main = {}

main.getAttributes = function (selector) {
  var attributes = selector.match(/(\[[^\]]*\])/g)
  return _.chain(attributes).map(function (attribute) {
    attribute = attribute.match(/\[(.+)\]/)[1]
    attribute = attribute.split('=')
    var key = attribute[0]
    var value = attribute[1].replace(/['"]+/g, '', '')
    return [key, value]
  }).object().value()
}

main.parseSelector = function (selectorStr) {
  var selectors = selectorStr.split(',')
  return _.map(selectors, function (selector) {
    selector = selector.replace(/^\s+|\s$/, '')
    return {
      'elementType': selector.match(/([^\[\]]*)/)[0],
      'attributes': main.getAttributes(selector)
    }
  })
}

var selectorStr = 'input[type=checkbox][class=fun]'
var obj = main.parseSelector(selectorStr)

console.log(obj)