我似乎应该是一个简单的操作。对于每个bridgedSection,我检查一个具有与bridged.referenceSection
匹配的ID的potentialSection。然后,我得到那个结果,用Cherio解析对象上的HTML,稍作修改(使用id进行测试),然后将bridgedSection和修改后的结果存储在一个对象上,然后将该对象推送到数组。
如果在推送之前记录新对象,则会得到正确的对象值。如果我从数组中记录它,则会得到错误的值 only 供参考。 bridgedSection很好,但是reference.section在数组中的所有条目之间都匹配。
轻描淡写地说我被彻底弄糊涂了。任何人都可以阐明我(显然)做错了什么吗?
var sectionCount = 0;
bridgedSections.forEach(bridged => {
var obj = potentialSections.find(obj => obj._id == bridged.referenceSection);
$ = cheerio.load(obj.html);
$(".meditor").html(bridged._id);// dropping the id here so it's easy to see if it was updated
obj.html = $.html();
obj.rand = Math.floor(Math.random() * 1000); // can't seem to add to obj either
var thisSection = {
referenceSection: obj,
bridgedSection: bridged,
}
console.log(thisSection) // correct value logged
currentSections.push(thisSection);
sectionCount++;
});
console.log(currentSections);
// this logs an array of the correct length but each
// {}.referenceSection is identical to the last entry pushed above
答案 0 :(得分:1)
JavaScript通过引用传递函数参数。这意味着发生以下情况:
derp = {a:1}
function passedByRef(param){
param['a'] = 2;
}
passedByRef(derp)
console.log(derp['a']) // 2
因此,当您将json对象传递给函数时,如果您在函数中修改该对象,它将更改原始对象。在将bridged
分配给thisSection
之前,您可能想对其进行深拷贝,因为如果稍后在bridged
中修改thisSection
的版本,它将修改原始对象。
这是一篇谈论cloning objects的帖子,或者您可以研究类似immutable js
的内容答案 1 :(得分:1)
为了试图弄清上述两个人在说什么,JavaScript语言(与其他语言一样)具有引用的概念,并且对该概念进行了大量使用。
当一个变量“引用”另一个变量时,仅一个一个 副本该值:其他所有内容均引用该值。因此,对这些引用中的任何一个进行的更改都会更改[one ...]基础值(并在所有引用中立即反映出来)。
引用的优点当然是它们非常“轻巧”。
如果您需要对数组或结构或所拥有的东西进行所谓的“深层复制” ,则可以这样做。如果要推送该值并确保不能更改它,则需要确保所推送的内容是这样的“深层副本”,或者没有引用(因为显然< strong>是,现在...)。您的选择。
NB 引用(尤其是 circular 引用)对内存管理(和“泄漏”)也具有重要意义,因为事物不会被内存“收割”经理直到所有对它的引用不再存在。 (一切都是“引用计数”。)
而且,我刚才所说的所有内容几乎均适用于支持此功能的每种语言,就像现在大多数语言一样。
答案 2 :(得分:0)
我认为您需要研究Javascript 深拷贝。
在修改第二个分配的变量时,您正在修改原始对象,因为它们指向同一对象。您真正需要的是复制对象,而不仅仅是指向它的指针。
看看这个:
https://scotch.io/bar-talk/copying-objects-in-javascript#toc-deep-copying-objects