您可以使用数组的filter或find方法。
ArrPerson.find(p=>p.name=='john')
ArrPerson.filter(p=>p.name=='john')
find方法从数组开头开始搜索,并在找到一个匹配元素时停止搜索。最坏情况下,如果正在搜索的元素是数组中的最后一个元素或者不存在,这个方法的时间复杂度将会是O(n)。这意味着该方法将进行n次检查(n是数组的长度),直到它停止。
filter方法总是执行O(n),因为每次都需要搜索整个数组以找到每个匹配的元素。
尽管可以通过创建新的数据结构来使某些操作更快(理论上),例如:
var hashmap = new Map();
var ArrPerson = [];
ArrPerson.push(new Person("john",12,"M1"));
hashmap.set("john",true);
这个ES6 Map将根据它包含的名称保留整个数组的索引。如果您想查看数组是否包含某个名称,可以执行以下操作:
hashmap.has('john')//true
这种方法的时间复杂度为O(1)。它只需要查看一次地图,以确定该名称是否存在于您的数组中。此外,您可以在地图内跟踪数组索引:
var index = ArrPerson.push(new Person("john",12,"M1"));
var map_indexes = hashmap.get("john");
if(map_indexes){
map_indexes.push(index-1);
hashmap.set("john",map_indexes);
}else{
hashmap.set("john",[index-1]);
}
map_indexes = hashmap.get("john");
采用这种方法,你不仅可以知道数组中是否有一个特定名称的人,还可以使用O(1)查找整个对象。
请注意,如果您想要其他标准,此映射将仅按名称索引人员,您需要另一个映射。同时,保持两个数据结构同步并不容易(从数组中删除一个元素也应该从映射中删除等)。
总之,如常所言,提高速度就意味着在我们的示例中牺牲了其他东西,例如内存和代码复杂性。
name
属性还是其他属性? - Nina Scholz