Javascript变量在array.filter操作期间丢失值

时间:2018-10-20 06:36:18

标签: javascript arrays

可能与谁有关

这篇文章实际上是一种XY问题的例子。

  

寻求帮助的人的真实问题(“ X”)被遮盖了,因为他们没有直接询问问题X,而是询问如何解决他们认为可以解决的第二个问题(“ Y”)问题X。

我最初的问题是该数组(在图片中的第127行)正在变空。当我寻找这个问题时,我震惊地发现变量在执行过程中变得空了。即使这就是这篇文章的目的,但如果我一直在思考,我就无需发布。

真正的问题?查看图像的第131行...

if (siblings[childitem].my.parents.length = 0) {

单等号导致一个空数组。

原始问题如下。


我通过chrome开发工具发现了这一点。

这是之前的照片。

before

您可以在本地范围内查看所有相关信息,并在实时代码内联的黄色文本中回显该信息。所有的值都是合适的。

在执行中执行下一步。 。 。

after

您可以在实时代码中看到标线片/光标已移至右侧。先前的局部变量已消失。 old parents现在是[],而childrenundefined

这是参考问题吗?我从this post here获得了filter语法。

到底发生了什么?

以下是您需要的文本代码。

selected.my.children.forEach (childitem => {
    // let parentindex = siblings[child].my.parents.indexOf(selected.my.place);
    let oldparents = siblings[childitem].my.parents;
    let newparents = oldparents.filter(e => {e != selected.my.place});
    siblings[childitem].my.parents = newparents;
    // if (parentindex > -1) {
    //  siblings[child].my.parents.splice(parentindex, 1)
    // }
    if (siblings[childitem].my.parents.length = 0) {
        siblings[childitem].faceup();
    }
    console.log(siblings[childitem].my);
});

2 个答案:

答案 0 :(得分:1)

因为您输入了新的功能范围。那就是您传递给过滤器函数的回调:

e => {e != selected.my.place} // <- this is a new scope, no local variables other than `e`

您可以清楚地看到e之外没有其他局部变量。

但是,您可以在父范围中找到childitemnewparents等。在您的示例中,它是Closure(单击Closure (tap)

答案 1 :(得分:-2)

ElementList是数组而不是数组,不能直接使用过滤器,需要先将其转换为数组:

sess3 = Session()
d1 = Device(hostname='d1', scope='s1', poll_ip='pi1')
p2 = Port(device=d1, name='port1')
p2 = sess3.merge(p2)
sess3.commit()
sess3.close()