Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象数组:访问对象';s值,而不遍历数组_Javascript_Arrays_Object - Fatal编程技术网

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)过程是通过索引、数学运算、在对象和映射中搜索键以及在集合中搜索值来获取数组值。