大数字打破 underscore.js _.contains
Posted
技术标签:
【中文标题】大数字打破 underscore.js _.contains【英文标题】:Big numbers break underscore.js _.contains 【发布时间】:2016-03-01 15:51:09 【问题描述】:在调试 mongoose
回调时,我发现 underscore.js 或 javascript 语言本身似乎对大数字有问题。
在下面的示例中,我存储了一个小数字和一个包含来自 mongoose 的 ObjectId(24 位数字)的字符串,以便尽可能清楚地显示问题。
var users = ["32", "300000000000000000000002"];
alert(_.contains(users, "32")); // true
alert(_.contains(users, (32).toString())); // true
alert(_.contains(users, "300000000000000000000002")); // true
alert(_.contains(users, (300000000000000000000002).toString())); // false - wait wat ?
当然,我的问题是如何让最后一次调用返回 true ?
我不希望将数组 users
转换为数字数组,因为 (1) 该数组在生产环境中可能很大,并且 (2) 我可能需要对数组执行其他操作。
【问题讨论】:
(300000000000000000000002).toString() === "3e+23"
24 位对于 js ***.com/questions/307179/… 来说太多了
感谢您的诊断意见并帮助了我,但我仍在寻找解决方案
ObjectId 是 24 字节的字符串,而不是 24 位的数字。为什么不将搜索输入限制为字符串?
【参考方案1】:
最后一个返回"3e+23"
不等于"300000000000000000000002"
【讨论】:
好的,您已经给出了该问题的有效技术原因。但是有解决办法吗?【参考方案2】:问题总是我得到一个输入字符串,它会自动转换为数字(通过库)。所以我只需要将“外键”设为较小的数字。我最终创建了一个自定义数字自动生成函数来规避这个问题:
var autoIncrement = require('mongoose-auto-increment');
var address = require('./Address');
var connection = mongoose.createConnection(address.mongo());
autoIncrement.initialize(connection);
var UserSchema = new mongoose.Schema( /* property definitions */);
mongoose.model('User', UserSchema);
UserSchema.plugin(autoIncrement.plugin,
model: 'User',
startAt: 10000001
);
因此,我不得不更改引用机制:
var GroupSchema = new mongoose.Schema(
users: [type: Number, ref: 'User'],
/* other property definitions */
);
【讨论】:
以上是关于大数字打破 underscore.js _.contains的主要内容,如果未能解决你的问题,请参考以下文章