这并不是设置数据的好方法 - 输入过多(您一遍又一遍地重复“records”、“medinc”、“statename”,而您绝对可以避免它,例如:
var records:Array = [];
var states:Array = ["nh", "ct", "nj" ... ];
var statenames:Array = ["New Hampshire", "Connecticut", "New Jersey" ... ];
var medincs:Array = [66303, 65958, 65173 ... ];
var hash:Object = { };
function addState(state:String, medinc:int, statename:String, hash:Object):Object
{
return hash[state] = { medinc: medinc, statename: statename };
}
for (var i:int; i < 50; i++)
{
records[i] = addState(states[i], medincs[i], statenames[i], hash);
}
虽然您已经按照您的方式完成了它,但这并不是必需的,但这可以为您节省一些击键,如果您还没有...
现在,关于您的搜索问题 - 首先,确实,在搜索之前对数组进行排序是值得的,但是如果您需要根据排序参数的值来搜索数组,那么有一个更好的算法那。也就是说,如果给定示例中的数据,您的具体任务是找出收入是 65958 的状态,然后,知道数组是按收入排序的,您可以使用二分搜索。
现在,对于具有 50 个状态的示例,除非您每秒执行数十万次,否则差异不会很明显,但总的来说,二分搜索将是可行的方法。
如果 Wiki 中的文章看起来太长而无法阅读;)二进制搜索背后的想法是,首先您猜测搜索的值恰好在数组的中间 - 您尝试该假设,如果您猜对了,则返回索引您刚刚找到,否则 - 您选择包含搜索值的间隔(剩余数组的一半)并这样做,直到您找到该值或检查相同的索引 - 这意味着找不到该值)。这将算法的渐近复杂度从 O(n) 降低到 O(log n)。
现在,如果你的目标是找到收入和状态之间的对应关系,但它如何与其他状态扩展并不重要(即数组中的索引并不重要),你可以有另一个哈希表,其中收入将是关键,状态信息对象将是价值,使用我上面的例子:
function addState(state:String, medinc:int, statename:String,
hash:Object, incomeHash:Object):Object
{
return incomeHash[medinc] =
hash[state] = { medinc: medinc, statename: statename };
}
然后incomeHash[medinc]
将在 O(1) 时间内按收入为您提供状态。