首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蜘蛛猴的E4X滤波

蜘蛛猴的E4X滤波
EN

Stack Overflow用户
提问于 2011-06-12 05:51:46
回答 2查看 344关注 0票数 2

我在SpiderMonkey中使用E4X,大部分语言看起来都很可靠,但是我不能让过滤起作用:

代码语言:javascript
复制
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')) );

期望值:

代码语言:javascript
复制
<person id="dave">Dave</person>
<person id="ian">Ian</person>
<person>John</person>

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

结果:

代码语言:javascript
复制
ReferenceError: name is not defined
ReferenceError: attribute is not defined

我甚至也不能让hasOwnProperty()工作:

代码语言:javascript
复制
xml.*.(trace( hasOwnProperty('@id') ));

false
false
false

具体来说,我在闪存中使用了JSFL,它使用了SpiderMonkey引擎。

从我到目前为止对E4X的基本了解来看,这是相当出乎意料的,对吧?因为我可以让这些表达式在ActionScript / FlashPlayer中工作得很好!

谢谢,戴夫

EN

回答 2

Stack Overflow用户

发布于 2011-06-12 19:33:39

好了,我已经尝试了很多方法,但仍然不能让原始语法工作,所以我能想到的最好的方法(考虑到这是一个很好的变通方法)就是扩展XMLList原型并添加一个filter()方法:

代码语言:javascript
复制
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...

代码语言:javascript
复制
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>

抓取和过滤节点非常直观:

代码语言:javascript
复制
// 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>

如果有人能在这方面纠正我,我会非常高兴,如果没有,我只想知道为什么我最初的过滤就是不起作用。

戴夫

票数 2
EN

Stack Overflow用户

发布于 2018-02-06 03:17:09

关于filter函数,只对发布的答案here做了一点小更正:

代码语言:javascript
复制
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;
}

原始的解决方案是最好的,这正是我正在寻找的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6318747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档