有没有一种有效的方法可以用键访问数组中的对象?

时间:2019-09-10 23:19:00

标签: javascript

data = [
    {
       _id: 1234,
       name: 'ddd'
    },
]

比方说,我在JavaScript中有这个Object数组,我想基于_id检索对象。

我知道我可以像这样进行过滤

data.filter((item, key) => { return item._id === "1234" })

但是我想知道是否有一种更快的方法,也许就像在访问带有键O(1)的字典时进行检索一样。

有帮助吗?

4 个答案:

答案 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();
});

或通过Array.prototype.reduce()

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;
  }
}