2011-06-11 65 views
2

我使用E4X在SpiderMonkey的,大多數的語言似乎很紮實,但我不能讓篩選工作:E4X過​​濾在SpiderMonkey的

var xml = <root> 
    <person id="dave">Dave</person> 
    <person id="ian">Ian</person> 
    <person>John</person> 
</root> 

trace(xml.*.(name() == 'person')); 
trace(xml.*.(attribute('@id'))); 

預計:

<person id="dave">Dave</person> 
<person id="ian">Ian</person> 
<person>John</person> 

<person id="dave">Dave</person> 
<person id="ian">Ian</person> 

結果:

ReferenceError: name is not defined 
ReferenceError: attribute is not defined 

我甚至無法hasOwnProperty()的工作之一:

xml.*.(trace(hasOwnProperty('@id'))); 

false 
false 
false 

具體來說,我在Flash中使用JSFL,它使用SpiderMonkey引擎。

從我迄今爲止對E4X的基本知識來看,這是相當意想不到的/錯誤的,對嗎?因爲我可以讓這些表達式在ActionScript/FlashPlayer中正常工作!

謝謝, 戴夫

回答

2

好了,我已經嘗試了一堆東西,我仍然無法得到原始語法的工作,這樣我就可以跟最好的(這是一個相當不錯的解決方法考慮)是延長XMLList中的原型,並添加過濾器()方法:

XMLList.prototype.function::filter = function(callback) 
{ 
    var output = new XMLList(); 
    var length = input.length(); 
    for(var i = 0; i < length; i++) 
    { 
     if(callback(input[i], i, input)) 
     { 
      output += input[i]; 
     } 
    } 
    return output; 
} 
與下面的XML

所以......

var xml = <root> 
    <person id="dave">Dave</person> 
    <person id="ian">Ian</person> 
    <person>John</person> 
    <group> 
     <person id="jane">Jane</person> 
     <person>Sarah</person> 
    </group> 
</root> 

這是很直觀的搶和FI濾波器節點:

// old 
var nodes = xml..person.(hasOwnProperty('@id')); 

// new 
var nodes = xml..person.filter(function(node){ return node.hasOwnProperty('@id'); }); 

<person id="dave">Dave</person> 
<person id="ian">Ian</person> 
<person id="jane">Jane</person> 

如果任何人都可以糾正我在這,我會超級高興,如果沒有,我只是想知道爲什麼我原來的過濾只是沒有工作。

戴夫

+0

我正在尋找完全相似的解決方案。我試過你的示例代碼,但它不工作。我得到錯誤「輸入未定義。 – tarekahf 2018-02-05 18:57:41

0

只是爲了回答一個小的修正貼here,關於filter功能:

XMLList.prototype.function::filter = function(callback) 
{ 
    var output = new XMLList(); 
    var input = this; 
    var length = input.length(); 
    for(var i = 0; i < length; i++) { 
     //console.println(i + ", " + input[i]); 
     if(callback(input[i], i, input)) 
     { 
      //console.println("Yes"); 
      output += input[i]; 
     } 
    } 
    //console.println('output = ' + output); 
    return output; 
} 

原來的解決方案是最好的,這正是我一直在尋找!