Javascript 对象数组:访问对象';s值,而不遍历数组
我有一组结构相似的对象:Javascript 对象数组:访问对象';s值,而不遍历数组,javascript,arrays,object,Javascript,Arrays,Object,我有一组结构相似的对象: var my_arr = [{property1: some_value, property2: another_value}, {}, {}, ...]; 目前,为了找到包含目标值的对象,我遍历数组的每个元素: var my_obj, target_value; for (let obj_in_arr of my_arr) { if (obj_in_arr.property1 === target_value) { m
var my_arr = [{property1: some_value, property2: another_value}, {}, {}, ...];
目前,为了找到包含目标值的对象,我遍历数组的每个元素:
var my_obj, target_value;
for (let obj_in_arr of my_arr) {
if (obj_in_arr.property1 === target_value) {
my_obj = obj_in_arr;
break;
}
}
有没有更快的办法?如何使用目标值直接访问对象,而不必进行迭代?我认为您仍然需要迭代数组,但您可以尝试underline.js的u.findIndex
我认为您无论如何都需要迭代数组,但您可以尝试underline.js的u.findIndex
如果只需要查找一次值,那么迭代实际上是唯一的方法 如果要在数组中查找多个值,可以在目标属性上创建一个键控对象,用作查找表:
var lookup = {};
for (var i = 0; i < my_arr.length; i++) {
lookup[my_arr[i].property1] = my_arr[i];
}
如果您可以访问es2015,您可以使查找表的生成更加简洁:
const lookup = my_arr.reduce((m, v) => (m[v.property1] = v, m), {});
如果您只需要找到一个值一次,那么迭代实际上是唯一的方法 如果要在数组中查找多个值,可以在目标属性上创建一个键控对象,用作查找表:
var lookup = {};
for (var i = 0; i < my_arr.length; i++) {
lookup[my_arr[i].property1] = my_arr[i];
}
如果您可以访问es2015,您可以使查找表的生成更加简洁:
const lookup = my_arr.reduce((m, v) => (m[v.property1] = v, m), {});
这仍然会遍历数组,但您可以使用本机js find函数
const objArray = [{ val: 1}, { val: 2}];
const targetObj = objArray.find((obj) => obj.val == 2 ) // { val: 2}
这仍然会遍历数组,但您可以使用本机js find函数
const objArray = [{ val: 1}, { val: 2}];
const targetObj = objArray.find((obj) => obj.val == 2 ) // { val: 2}
如果预先填充
新地图
所有后续搜索都将在O(1)中
如果预先填充
新地图
所有后续搜索都将在O(1)中
“如何访问具有目标值的对象”哪个对象?有几十个。如果您知道对象的索引,请确保这是可能的。如果在数据结构中有一组对象,比如数组,那么查找一个特定的对象总是需要迭代。这就是野兽的本性。如果您需要更直接的访问,请创建一个
Map
实例或一个将字符串键映射到特定数组元素的普通对象。如果您只知道目标值,则必须至少部分地迭代数组,以找到具有该目标的对象(与当前一样)。除非您事先知道具有该目标值的对象处于哪个索引,否则恐怕无法避免迭代。也许可以考虑创建一个将目标值映射到索引的索引对象,这取决于用例,但是如果您打算重复搜索元素,可以预先填充一个映射。建立它需要预付费用,但在这之后,搜索是“即时的”,也就是O(1)谢谢大家。Pointy和Andrew,这听起来像是预填充地图最符合我的目的,所以谢谢你的想法。“我如何访问目标值的对象”哪个对象?有几十个。如果您知道对象的索引,请确保这是可能的。如果在数据结构中有一组对象,比如数组,那么查找一个特定的对象总是需要迭代。这就是野兽的本性。如果您需要更直接的访问,请创建一个Map
实例或一个将字符串键映射到特定数组元素的普通对象。如果您只知道目标值,则必须至少部分地迭代数组,以找到具有该目标的对象(与当前一样)。除非您事先知道具有该目标值的对象处于哪个索引,否则恐怕无法避免迭代。也许可以考虑创建一个将目标值映射到索引的索引对象,这取决于用例,但是如果您打算重复搜索元素,可以预先填充一个映射。建立它需要预付费用,但在这之后,搜索是“即时的”,也就是O(1)谢谢大家。Pointy和Andrew,这听起来像是预填充地图最符合我的目的,所以谢谢你的想法。谢谢,Andrew。O(1)是什么?(这里是新手程序员…)大O表示法表示函数的时间复杂性。它表示代码从开始到结束所需的操作数。假设这是最坏的情况。O(n)在整个数组中迭代,因为必须观察每个元素,其中n
表示数组元素的数量。O(1)是可能的最佳时间复杂度。它表示单个操作。常见的O(1)过程是通过索引、数学运算、在对象和映射中搜索键以及在集合中搜索值来获取数组值。谢谢,Andrew。O(1)是什么?(这里是新手程序员…)大O表示法表示函数的时间复杂性。它表示代码从开始到结束所需的操作数。假设这是最坏的情况。O(n)在整个数组中迭代,因为必须观察每个元素,其中n
表示数组元素的数量。O(1)是可能的最佳时间复杂度。它表示单个操作。常见的O(1)过程是通过索引、数学运算、在对象和映射中搜索键以及在集合中搜索值来获取数组值。