大数突破 underscore.js _.contains
Big numbers break underscore.js _.contains
在调试 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 ?
我的问题当然是,如何使最后一次调用 return 为真?
我不想将数组 users
转换为数字数组,因为 (1) 该数组在生产环境中可能很大,并且 (2) 我可能需要对它进行其他操作数组。
不等于"300000000000000000000002"
的最后一个returns"3e+23"
问题始终是我得到一个自动转换为数字(由库)的输入字符串。所以我只需要让 'foreign key' 变小。我最终创建了一个自定义数字自动生成函数来规避这个问题:
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 */
});
在调试 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 ?
我的问题当然是,如何使最后一次调用 return 为真?
我不想将数组 users
转换为数字数组,因为 (1) 该数组在生产环境中可能很大,并且 (2) 我可能需要对它进行其他操作数组。
不等于"300000000000000000000002"
"3e+23"
问题始终是我得到一个自动转换为数字(由库)的输入字符串。所以我只需要让 'foreign key' 变小。我最终创建了一个自定义数字自动生成函数来规避这个问题:
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 */
});