在对象数组中找到需要的元素的最佳方法
我有我的班级的对象数组。我的类的名称变量对于创建的每个对象都是唯一的。现在,我想查找名称为“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());
可以使用find method of Arrays object:
const myObject = arr.find(o => o.name === 'the_name_you_search');
这一个没有IE支持:( – Abdel
谢谢!!第四种方式是绝对完美的!:) – someRandomSerbianGuy