data = [
{
_id: 1234,
name: 'ddd'
},
]
比方说,我在JavaScript中有这个Object数组,我想基于_id检索对象。
我知道我可以像这样进行过滤
data.filter((item, key) => { return item._id === "1234" })
但是我想知道是否有一种更快的方法,也许就像在访问带有键O(1)
的字典时进行检索一样。
有帮助吗?
答案 0 :(得分:2)
您可以使用Array.prototype.find()
:
data.find(({ _id }) => _id === '1234')
// or without destructuring and implicit return
data.find(item => { return item._id === '1234' })
答案 1 :(得分:2)
如果您要FieldValue.increment(1)
查找,建议您转换为Map
client.on("offline",function(){
client.end();
});
O(1)
请注意,此操作最多为const mappedData = new Map(data.map(item => ([item._id, item])))
,但只需执行一次即可。
现在您可以提取时间为const mappedData = data.reduce((map, item) => map.set(item._id, item), new Map())
的项目
O(n)
答案 2 :(得分:1)
不。如果要以恒定的时间复杂度conn = psycopg2.connect(f"host='{ENDPOINT}' port='5439' user={temp_user} password={temp_password} dbname='{DB_NAME}'")
访问它们,则可以将该属性用作索引或键。
在这里,索引为<VALUES>
,因此无需搜索即可获得O(1)
,0,1,2 etc.
。
但是,如果您想在该索引的值中找到某些内容,则必须进行搜索,并且这不是恒定时间复杂度的操作。
答案 3 :(得分:0)
如果您需要多次执行此查询,则通过将数组转换为查找对象将在第一时间花费o(n)
,但以后的查询将仅花费恒定的时间复杂度o(1)
< / p>
const dataWithIdKey = data.reduce((acc, item) => {
acc[item._id] = item;
return acc;
}, {});
const item1234 = dataWithIdKey['1234']
另一方面,如果只有一次查询。 find
函数在找到具有所需键的项目时将停止运行。或者for循环也可以解决此问题。但是,两者的最坏情况仍然取o(n)
data.find( ({_id}) => _id === '1234' );
for(let i = 0; i < data.length; i++){
if(data[i]._id === '1234'){
// do something here
break;
}
}