NodeJS:向集合添加含唯一哈希与重复人名的元素异常问题
问题分析与解决方案
看起来你遇到的情况有点反常啊——正常来说,每次调用collection.push()都会往数组里新增一个元素,不可能出现"仅哈希值更新,集合内始终只有1个条目"的情况。大概率是你的代码里藏了一些容易忽略的小问题,我来帮你排查下:
最可能的原因:重复推送同一个对象引用
如果你的代码是类似下面这样写的,就会出现你描述的问题:
const collection = []; // 先创建一个固定的对象 const johnEntry = { person: 'John' }; // 多次尝试添加 for (let i = 0; i < 2; i++) { // 只修改已有对象的hash属性 johnEntry.hash = crypto.randomBytes(64).toString('hex'); // 推送同一个对象引用 collection.push(johnEntry); }
这种情况下,你每次push的都是同一个对象的引用,数组里的所有元素其实指向的是内存中的同一个对象。当你更新hash时,所有数组条目显示的hash都会跟着变;如果你误以为数组长度没增加,可能是查看时没注意——其实数组长度是会增加的,但每个元素都是同一个对象,看起来好像"只有一个条目"。
正确的写法:每次创建新对象
要解决这个问题,你需要每次push时都创建一个全新的对象,就像你最开始构思的那样,但要确保没有重复引用的问题:
const collection = []; // 每次添加都生成独立的新对象 collection.push({ hash: crypto.randomBytes(64).toString('hex'), person: 'John' }); collection.push({ hash: crypto.randomBytes(64).toString('hex'), person: 'John' }); // 现在检查数组状态 console.log(collection.length); // 应该输出2 console.log(collection[0].hash !== collection[1].hash); // 应该输出true
这样每次push的都是独立的对象,各自拥有唯一的hash,数组长度也会正确累加。
其他可能的排查方向
如果上面的写法你已经用了,但还是有问题,那可以检查下这些点:
- 是不是在每次
push之前不小心执行了collection = [],把数组清空了? - 有没有其他代码在修改
collection,比如用collection.splice()或者重新赋值? - 你是怎么查看集合内容的?会不会是控制台显示的是对象的实时引用,而不是快照?
你可以先排查下代码里的引用问题,按照正确的写法试试,应该就能解决啦!
内容的提问来源于stack exchange,提问作者eymas
相关产品推荐
相关产品推荐

