在对象数组中查找所需元素的最佳方法

时间:2017-06-01 10:19:22

标签: arrays node.js

我有班上的一系列对象。我的类具有名称变量,对于创建的每个对象都是唯一的。现在,我想找到一个名为“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;
    }
}

但我认为这是非常强大的解决方案,所以我想知道是否有更好/更聪明/更快的方法。

2 个答案:

答案 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());