我有班上的一系列对象。我的类具有名称变量,对于创建的每个对象都是唯一的。现在,我想找到一个名为“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;
}
}
但我认为这是非常强大的解决方案,所以我想知道是否有更好/更聪明/更快的方法。
答案 0 :(得分:1)
您可以使用find method of Arrays object:
const myObject = arr.find(o => o.name === 'the_name_you_search');
答案 1 :(得分:1)
如果您想找到项目的索引,通常最容易使用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
使用==
运算符过滤haystack,从而忽略了比较值实际上是不同类型的事实。然后将过滤后的数组的第一个元素输入indexOf
。这将允许您使用原始字符串作为针并搜索大海捞针。
result2
使用相同的方法,但将两个比较值都转换为原始字符串,确保它们都是相同的类型。这将允许您在大海捞针和针头中自由地混合和匹配基元和String
对象。
result3
将所有haystack值映射到原始字符串,然后在新的基元数组上使用indexOf
。我还在针上添加了toString
以确保它也是原始的。这与您的方法类似,但每次搜索针时都会运行映射。这可能不是最理想的。
result4
使用Array.prototype.find
在haystack上找到目标对象,然后将结果提供给indexOf
。这可能是最快的,但我没有经验数据支持这一点。
现在,如果您想要找到实际商品,而不仅仅是其索引,那么您最好使用Array.prototype.find
:
const result = haystack.find(item => item == needle);
或者,如果两者都是String
个对象:
const result = haystack.find(item => item.toString() === needle.toString());