我有一系列数据,并且它的大小逐渐增加。我想查找其ID的数据的特定行。我有两个选择。首先:创建一个数组,然后将每行添加到该数组中,每次我想要一行时,只需搜索数组中的项目或使用数组原型函数(查找)。另一个选择是创建一个对象,每次出现新行时,只需将该行添加为属性(属性名称将为该行的ID)。当我想查找一行时,只需通过其名称(Id)获取该对象的属性即可。现在我想知道哪种选择是最有效的方法? (或者还有第三种选择?)
第一个选项:
const array = [
{
"Id":15659,
"FeederCode":169,
"NmberOfRepetition":1
},
{
"Id":15627,
"FeederCode":98,
"NmberOfRepetition":2
},
{
"Id":15557,
"FeederCode":98,
"NmberOfRepetition":1
}
]
每次出现新行时,都会将新行推入此数组。
访问权限:array.find(x => x.Id === 15659)
第二个选项:
const object = {
15659:{
"Id":15659,
"FeederCode":169,
"NmberOfRepetition":1
},
15627:{
"Id":15627,
"FeederCode":98,
"NmberOfRepetition":2
},
15557:{
"Id":15557,
"FeederCode":98,
"NmberOfRepetition":1
}
}
每次出现新行时,都会向该对象添加一个新属性。
访问权限:object[15659]
编辑:我在某处读到,将新属性添加到现有对象会带来太多成本。
答案 0 :(得分:3)
如果您希望执行搜索操作,则应使用Object
,因为与Array
中的搜索相比,它可以提供更好的性能。
Object
中的搜索复杂度为O(1)
,而Array
中的搜索复杂度为O(n)
。因此,要获得更好的性能,应使用Object
。
答案 1 :(得分:1)
在第一个示例中,每次使用“查找”时,您都必须迭代数组。
在第二个示例中,无论其中有多少项,您都将直接访问属性,这将导致O(1)执行时间始终固定。因此,为了获得更好的性能,您应该选择第二种方式
答案 2 :(得分:1)
从对象读取更快,并且需要O(1)时间,就像@NikhilAggarwal刚刚说的那样。 但是最近我正在阅读有关V8优化的内容,并希望进行检查,因此使用基准js进行确认。
这是我的发现-
obj或arr中的条目数:100000
如果我们减少条目的数量-对象的操作次数几乎保持不变,但数组的操作呈指数增长。
obj或arr中的条目数:100
obj或arr中的条目数:10