2
早上好!我在freeNumberGenerator函数中遇到了一个基本查找用法的问题。问题是代码的第一个例子不能返回给我一个空闲数字,如果它需要一个像[0, 1, 2, 3]
这样的数组,它将总是返回0
,因为0
不是数组arr参数的一部分。看起来像我说的基本用法,但我找不到[uhuh ...]为什么。为什么array.find()不能按预期工作?
不工作:
public getFreeNumber(...arr: number[]): number {
let freeNumber: number = 0;
let isTaken: boolean = true;
while (isTaken) {
if (arr.find(n => n === freeNumber)) {
++freeNumber;
} else {
isTaken = false;
}
}
return freeNumber;
}
工作:
public getFreeNumber(...arr: number[]): number {
let freeNumber: number = 0;
let isTaken: boolean = true;
while (isTaken) {
if (arr.indexOf(freeNumber) !== -1) {
++freeNumber;
} else {
isTaken = false;
}
}
return freeNumber;
}
工作:
public getFreeId(arr: Array<IIdentifiable>): number {
let freeId: number = 0;
let isTaken: boolean = true;
while (isTaken) {
if (arr.find(a => a.id === freeId)) {
++freeId;
} else {
isTaken = false;
}
}
return freeId;
}
哦,我现在看到了,所以考虑到你的回应,与上次的区别例如,它返回一个对象'IIdentifiable'而不是id值,'0'本身。我应该再次阅读文档...什么是最有效的方式来使用/使用? 'indexOf'(第二个例子)? – everblack
我认为'find'在那里是一个完全有效的命令,我并不认为性能有如此大的差异(我也不知道你应该支持哪种数据)。 'find'和'indexOf'都会连续迭代所有的值。如果它需要高性能,并且你期待很多值,我宁愿建议你将它映射到一个对象中,然后通过检查映射对象上是否存在该属性来搜索空闲数字(这会更快大型数组,因为它不会继续搜索整个数组) – Icepickle