大数字打破 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的主要内容,如果未能解决你的问题,请参考以下文章

underscore.js,js工具库

underscore.js

underscore.js 分析 第四天

浅谈 Underscore.js 中 _.throttle 和 _.debounce 的差异[转]

underscore.js框架Objects类API学习

巧用underscore.js处理复杂的json