递归函数中的Array.prototype.reduce产生意外结果

尼克·曼宁

我正在尝试编写一个将数组转换为DocumentFragment的函数。数组的每个项目都将成为HTMLElement。它的标签名将是数组项的类名*,其属性将是值是字符串的数组项的属性。

因此,例如,如果我有以下构造函数:

function Person(name,pets){
        this.name=name;
        this.pets=pets;
    }
function Pet(name){this.name=name;}

而这个数据:

var arr=[
        new Person("Bob",[
            new Pet("Sparky"),
            new Pet("Wishbone")
        ]),
        new Person("Mary",[
            new Pet("Maggie"),
            new Pet("Sprinkles")
        ])
    ];

我使用此功能,效果很好:

Array.prototype.toDocFrag=function(){
        return this.reduce(function(docFrag,currentItem){
            elem=document.createElement(currentItem.constructor.name.toLowerCase());
            for (prop in currentItem){
                if (typeof currentItem[prop]==="string") elem.setAttribute(prop,currentItem[prop])
                //if (currentItem[prop] instanceof Array) elem.appendChild(currentItem[prop].toDocFrag())
            }
            docFrag.appendChild(elem)
            return docFrag;
        },document.createDocumentFragment())
    }

如果运行arr.toDocFrag(),则会得到包含<person name="Bob"></person><person name="Mary"></person>预期内容的docFrag

但是现在我想要做的是使它递归,这样它就可以看到“ pets”并在每个文件上附加另一个DocumentFragment,<person>所以我最终得到了

<person name="Bob">
    <pet name="Sparky"></pet>
    <pet name="Wishbone"></pet>
</person>
<person name="Mary">
    <pet name="Maggie"></pet>
    <pet name="Sprinkles"></pet>
</person> 

取消注释我在代码中注释掉的行,我相信它应该起作用。但是,由于某种原因,arr.toDocFrag()只是返回<pet name="Wishbone"></pet><pet name="Sprinkles"></pet>

我的逻辑有什么问题?我是否对Array.prototype.reduce递归函数有所误解

谢谢!


脚注

*通过类名,我的意思是初始化实例的构造函数的名称。

贝吉

您的问题是这elem是一个隐式全局变量这与您的第一个函数无关紧要,但是完全弄乱了调用覆盖elem其调用者的递归函数

使用一条var语句在本地声明变量(也缺少该变量prop)。并使用严格模式来获取有关此类行为的错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R的gsub函数产生意外结果

Orderby函数产生意外结果

Java中的XOR“ ^”产生意外结果

Deepcopying函数变量产生意外结果

EXSLT date:add函数产生意外结果

迭代日期数组的函数会产生意外的结果

php in_array()以数组作为指针产生意外结果

gawk 中的字符串连接产生意外结果

在Go并行中处理数组会产生意外结果

在JavaScript中添加日期会产生意外结果

Makefile 中的变量替换产生意外结果

多个goroutine中的scanf产生意外结果

在PostgreSQL中与NULL进行比较会产生意外结果

为什么在Excel中查找会产生意外结果?

C#中的时间跨度产生意外结果

从函数中调用malloc和realloc会产生意外结果

为什么C中的此函数会产生意外结果?

通过构造函数初始化构造函数会产生意外结果吗?

R计算股票的beta(使用PerformanceAnalytics CAPM.beta()函数或lm()函数产生意外结果)

带有LAST_INSERT_ID()的MySQL函数产生意外结果

使用std :: set的.begin()和.end()函数会产生意外的结果

在python中绘制3D零均值,单位方差高斯会产生意外结果

在类实例字典中存储对象会产生意外结果

Java中的字符串拆分会产生意外的结果

熊猫数据框替换列中的子字符串产生意外结果

C ++:在基础对象列表中,派生内存在通过引用传递时会产生意外结果

过滤器中的Servlet转发会产生意外结果

在单击事件中更改 div 的背景颜色会产生意外(或预期?)结果

在PHP中调用(遍历)MySQL行列表会产生意外结果