【问题标题】:How to execute my code to get the wanted result如何执行我的代码以获得想要的结果
【发布时间】:2019-11-21 23:16:25
【问题描述】:

我创建了一个包含对象的数组,

我在我的数组上循环,对于包含 y == 5 的对象,我影响对象的布尔变量,然后我通过条件阻止访问,

但是我看到下一个数组上的同一个对象受到了同一个布尔变量的影响,我的控制台日志显示这种影响只准时执行, 如何阻止对下一个数组元素的影响?

代码

  test: function(req, res){

    console.log("yesss")
    var a = {x:1}
    let b = {x:2}
    let c = {x:3}
    let d = {x:4}

    let tab1 = []
    a.y = 5
    b.y = 10
    c.y = 10
    d.y = 10
    let group1 = [a, c, d]

    let group2 = [a, b, d]


    tab1.push(group1)
    tab1.push(group2)


    let test = false
    async.each(tab1, function(group, next){

        group.forEach(function(elem){

            if(elem.y == 5 && !test)
            {
                console.log("******* executed ******")
                test = true
                elem.bool = true
            }
            console.log("elem : ", elem)

        })

        next()
    }, function(){

      return res.status(200).json({success: true, data: tab1})
    })
},

这是我的控制台日志

Console.log

    ******* executed ******
elem :  { x: 1, y: 5, bool: true }
elem :  { x: 3, y: 10 }
elem :  { x: 4, y: 10 }
elem :  { x: 1, y: 5, bool: true }
elem :  { x: 2, y: 10 }
elem :  { x: 4, y: 10 }

JsonReturn

{
"success": true,
"data": [
    [
        {
            "x": 1,
            "y": 5,
            "bool": true
        },
        {
            "x": 3,
            "y": 10
        },
        {
            "x": 4,
            "y": 10
        }
    ],
    [
        {
            "x": 1,
            "y": 5,
            "bool": true
        },
        {
            "x": 2,
            "y": 10
        },
        {
            "x": 4,
            "y": 10
        }
    ]
]
}

【问题讨论】:

  • 我相信这是因为您的数组中的对象是引用,并且您正在向两个数组添加相同的引用。在添加对象时尝试制作对象的深层副本,它应该会有所不同。

标签: javascript node.js async.js


【解决方案1】:

group1group2 是引用相同对象的数组,使用 JSON.parse()JSON.stringify() 进行复制:

let group1 = JSON.parse(JSON.stringify([a, c, d]));

let group2 = JSON.parse(JSON.stringify([a, b, d]));

【讨论】:

    【解决方案2】:

    对象是通过引用分配的,因此您需要对对象进行深层复制,否则对一个对象所做的更改将不可避免地改变另一个对象。在您的示例中,您可以通过简单地定义一个新变量来保存您想要的数据来避免这种情况。

    换句话说,而不是这些行:

    var a = {x:1}
    let b = {x:2}
    let c = {x:3}
    let d = {x:4}
    
    let tab1 = []
    a.y = 5
    b.y = 10
    c.y = 10
    d.y = 10
    let group1 = [a, c, d]
    
    let group2 = [a, b, d]
    

    你可以使用这些行:

    let a = {x:1}
    let b = {x:2}
    let c = {x:3}
    let d = {x:4}
    let e = {x:5}
    let f = {x:6}
    
    let tab1 = []
    a.y = 5
    b.y = 10
    c.y = 10
    d.y = 5
    e.y = 10
    f.y = 10
    let group1 = [a, b, c]
    
    let group2 = [d, e, f]
    

    然后你会看到行为如你所愿。我不确定你的代码的目的是什么,但我想你会知道从这里去哪里。

    【讨论】:

    • 谢谢,是的,这是代码的另一个目的有这个问题,所以我尝试做一个深拷贝
    【解决方案3】:

    我尝试制作引用对象的深层副本,它可以工作

    let group1 = [Object.assign({}, a), c, d]
    
        let group2 = [Object.assign({}, a), b, d]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2015-06-10
      • 2022-09-29
      • 1970-01-01
      相关资源
      最近更新 更多