首页 > 解决方案 > 将 JavaScript 对象从一个数组复制到另一个数组是如何工作的?

问题描述

我想将一个JavaScript元素从一个数组复制到另一个数组,然后编辑它的一些属性。我使用的具体代码是:

var friends=[]
var enemies=[
    {
        name: "Slime",
        health: 20,
        attack: 10,
        defense: 15,
        speed: 5,
        drops: {name: "Vial of Blood", chance: 10, type: "consumable", id: 0},
        friendable: {possible: false}
    },
    {
        name: "Bat",
        health: 15,
        attack: 5,
        defense: 10,
        speed: 20,
        drops: {name: "Speedy Vial", chance: 5, type: "consumable", id: 1},
        friendable: {possible: true, item: 0}
    }
]

function dofriend(num11,num12) {
    let protype=enemies[num12]
    sack.splice(num11,1)
    invid.splice(num11,1)
    invtype.splice(num11,1)
    friends.push(protype)
    friends[friends.length-1].drops=protype.name
    friends[friends.length-1].name=prompt("Pick a name for your friend.",protype.name)
    battlechk=false;
    document.getElementById("textbox").innerText="You befriended "+friends[friends.length-1].name+"!"
    document.getElementById("optionbox").innerHTML="<button class=\"option\" onclick=\"cancel()\">Yay!</button>"
}

应该发生的是一个新元素被添加到与friends数组中的元素之一相同的enemies数组中。然后允许玩家为friends数组中的那个元素输入一个新名称。自从掉落后,部分元素不再需要,我想将其替换为原始名称以备将来使用。实际发生的是enemies元素和friends元素都被编辑为相同。我不明白为什么。

在我编辑内容时可能会发生其他事情,但这似乎不太可能。我检查并没有发现任何东西,但如果你想看看完整的代码可以在这里找到。此示例中使用的文件是friend.jsglobalvars.js。此外,battle.jsexplore.js也涉及到这里。battle.js导致friend.js被调用,然后friends在 explore.js 中使用该数组。

我有兴趣了解复制时 JavaScript 元素的行为方式,以及是否有办法在不编辑enemies数组中的元素的情况下做到这一点。

编辑:将JSON的每个实例更改为JavaScript,因为我认为这是JSON是错误的。

标签: javascriptarrays

解决方案


JavaScript 对象不能被复制。相反,所有可能的副本都链接回原件。您必须使用所需的值对新对象进行硬编码,以便它不会链接到原始对象。例如:

let f={
     name: "namehere",
     secondAttribute: 0
}
let r={
    name: f.name,
    secondAttribute: f.secondAttribute
}

r 没有链接到 f,即使它们具有相同的属性。您可以编辑 r 或 f 而不更改另一个。


推荐阅读