在对象数组中找到需要的元素的最佳方法

问题描述:

我有我的班级的对象数组。我的类的名称变量对于创建的每个对象都是唯一的。现在,我想查找名称为“test”的数组中的对象。我想尝试使用名称作为元素创建第二个数组,并在第一个数组中创建新对象以在第二个数组中创建对象,以便共享索引号。事情是这样的:在对象数组中找到需要的元素的最佳方法

arrayOfObjects.push(new obj("test")); 
arrayOfNames.push("test"); 

function findIndexNumberOf(name){ 
    for(var i = 0; i < arrayOfNames.length; i++){ 
     if(arrayOfNames[i] === name) 
     return i; 
    } 
} 

但我认为这是相当强大的解决方案,所以我不知道有没有这样做的更好/更聪明/更快的方式。

如果你想找到项目的指标,一般最简单的就是使用indexOf

const haystack = ["this", "is", "a", "test"]; 
const needle = "this"; 

const result = haystack.indexOf(needle); 

然而,这将工作与原始类型。假设你有一组对象,比较它们将需要不同的方法。下面是一些俏皮话:

const haystack = [new String("this"), new String("is"), new String("a"), new String("test")]; 
const needle = "test"; 

const result1 = haystack.indexOf(haystack.filter(item => item == needle)[0]); 
const result2 = haystack.indexOf(haystack.filter(item => item.toString() === needle.toString())[0]); 
const result3 = haystack.map(item => item.toString()).indexOf(needle.toString()); 
const result4 = haystack.indexOf(haystack.find(item => item.toString() === needle.toString())); 

result1过滤使用==操作草垛,从而忽视了一个事实,即比较的值实际上是不同的类型。然后将滤波后的数组的第一个元素输入到indexOf。这将允许您使用原始字符串作为针并搜索物体的草堆。

result2使用相同的方法,但将两个比较值转换为基本字符串,确保它们都是相同类型。这将允许你在干草堆和针头中宽松地混合和匹配原始物体和物体。

result3将所有haystack值映射到原始字符串,然后在该新的基元数组上使用indexOf。我还向针添加了toString,以确保它也是一个原始的。这与您的方法类似,但每次搜索针时都会执行映射。这可能不是最理想的。

result4使用Array.prototype.find来定位干草堆上的目标对象,然后将结果提供给indexOf。这可能是最快的,但我没有经验数据来支持这一点。现在

,如果你想找到实际的项目,不只是它的索引,你最好使用Array.prototype.find

const result = haystack.find(item => item == needle); 

,或者在情况下都是String对象:

const result = haystack.find(item => item.toString() === needle.toString()); 
+0

谢谢!!第四种方式是绝对完美的!:) – someRandomSerbianGuy

可以使用find method of Arrays object

const myObject = arr.find(o => o.name === 'the_name_you_search'); 
+0

这一个没有IE支持:( – Abdel