我在SpiderMonkey中使用E4X,大部分语言看起来都很可靠,但是我不能让过滤起作用:
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具体来说,我在闪存中使用了JSFL,它使用了SpiderMonkey引擎。
从我到目前为止对E4X的基本了解来看,这是相当出乎意料的,对吧?因为我可以让这些表达式在ActionScript / FlashPlayer中工作得很好!
谢谢,戴夫
发布于 2011-06-12 19:33:39
好了,我已经尝试了很多方法,但仍然不能让原始语法工作,所以我能想到的最好的方法(考虑到这是一个很好的变通方法)就是扩展XMLList原型并添加一个filter()方法:
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>抓取和过滤节点非常直观:
// 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>如果有人能在这方面纠正我,我会非常高兴,如果没有,我只想知道为什么我最初的过滤就是不起作用。
戴夫
发布于 2018-02-06 03:17:09
关于filter函数,只对发布的答案here做了一点小更正:
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;
}原始的解决方案是最好的,这正是我正在寻找的!
https://stackoverflow.com/questions/6318747
复制相似问题