Jquery Selector使用AND多个兄弟

时间:2016-06-03 14:45:02

标签: jquery

我试图弄清楚如何使用带有兄弟节点的AND运算符进行选择。我有以下XML:

<PRODUCT>
  <TYPE>CAR</TYPE>
  <PRICE>23.42</PRICE>
  <COLOR>BLUE</COLOR>
  <DOORS>5</DOORS>
  <CATEGORY>
    <ITEM>23</ITEM>
  </CATEGORY>
</PRODUCT>
<PRODUCT>
  <TYPE>VAN</TYPE>
  <PRICE>23.42</PRICE>
  <COLOR>YELLOW</COLOR>
  <DOORS>4</DOORS>
  <CATEGORY>
    <ITEM>23</ITEM>
  </CATEGORY>
</PRODUCT>
<PRODUCT>
  <TYPE>CAR</TYPE>
  <PRICE>23.42</PRICE>
  <COLOR>GREEN</COLOR>
  <DOORS>4</DOORS>
  <CATEGORY>
    <ITEM>24</ITEM>
  </CATEGORY>
</PRODUCT>
<PRODUCT>
  <TYPE>CAR</TYPE>
  <PRICE>80.00</PRICE>
  <COLOR>BLUE</COLOR>
  <DOORS>5</DOORS>
  <CATEGORY>
    <ITEM>26</ITEM>
  </CATEGORY>
</PRODUCT>

我想选择所有产品类型为Car,门为5,Category.Item为23.我试图这样做而不必手动运行foreach循环,是否有选择器可以实现这个?

1 个答案:

答案 0 :(得分:1)

没有只有jQuery选择器的解决方案,主要是因为jQuery :contains选择器也匹配子串。如果这不是你的问题,那么这将做你想要的:

var match = $(xml).has('>type:contains("CAR")')
                  .has('>doors:contains("5")')
                  .has('>category>item:contains("23")');

var xml = `<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>VAN</TYPE>
<PRICE>23.42</PRICE>
<COLOR>YELLOW</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>GREEN</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>24</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>80.00</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>26</ITEM>
</CATEGORY>
</PRODUCT>`;

var match = $(xml).has('>type:contains("CAR")')
                  .has('>doors:contains("5")')
                  .has('>category>item:contains("23")');

xmlResult = $('<div>').append(match).html();
console.log(xmlResult);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

替代迭代

要处理上述解决方案的限制,并且只接受完全匹配的文本,您需要进行迭代,例如使用filter

var match = $(xml).filter(function () {
    return $(this).find('>type').text() == 'CAR' &&
           $(this).find('>doors').text() == '5' &&
           $(this).find('>category>item').filter(function () { 
               return $(this).text() == '23';
           }).length > 0;
});

var xml = `<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>VAN</TYPE>
<PRICE>23.42</PRICE>
<COLOR>YELLOW</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>GREEN</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>24</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>80.00</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>26</ITEM>
</CATEGORY>
</PRODUCT>`;

var match = $(xml).filter(function () {
    return $(this).find('>type').text() == 'CAR' &&
           $(this).find('>doors').text() == '5' &&
           $(this).find('>category>item').filter(function () { 
               return $(this).text() == '23';
           }).length > 0;
});

xmlResult = $('<div>').append(match).html();
console.log(xmlResult);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

注意内部filter:需要检查所有类别项目,而不仅仅是第一项。

备注:示例XML不是真正有效的XML,因为它没有单个根节点。将它称为XML片段会更好。为了有效,您需要将其包装在标签中,例如<PRODUCTS>...</PRODUCTS>。当然,上述解决方案看起来会略有不同。