我具有以下功能来检查重复项;
IntStream.rangeClosed(1, numbers.length * numbers.length)
.mapToObj(n -> new int[]{1, 2})
.collect(Collectors.toList());
我用它来检查某人是否没有从他们的库存中提供两个相同的物品来出售,因为我们不允许他或她获得应有的两倍的钱。
它工作了一段时间,但后来我认为有人故意伤害并以某种方式破坏了它。我已经进行了一段时间的测试,发现我可以通过使数组如下所示(我的清单的ID)来绕过这个系统;
function hasDuplicates(array) {
return (new Set(array)).size !== array.length;
}
但是如果您这样做,则可以绕过;
var array = [312, 329, 932]; //normal > should bypass
var array = [333, 333, 333]; //not normal > can't bypass
有什么办法可以迅速解决吗?
修改 数据库查询无论如何都会查询数据,即使它以333 //字符串的形式提供。
var array = [333, '333/', '333//'];
答案 0 :(得分:2)
array.every(n => Number.isInteger(n))
只需确保所有内容都是数组中的数字即可。
答案 1 :(得分:0)
您可以对哈希执行以下操作,
并使用regex
删除特殊字符并仅保留一个数字(也建议将其广播到Number
)。
var array = ['333//', 212, '333/'];
var hash = {};
array.forEach(num => {
if(!Number.isInteger(num)) {
num = Number(num.replace(/[^\w\s]/gi, ''));
}
if(!hash[num]) {
hash[num] = num;
}
})
var newArray = Object.values(hash);
console.log(newArray);