了解在数组中查找对象

时间:2016-07-15 13:10:22

标签: javascript arrays

我的尝试

嗨,我们可以做点什么

var myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'ye'}];
    function getById(id, myArray) {
    return myArray.filter(function(obj) {
      if(obj.id == id) {
        return obj 
      }
    })
    }

    get_my_obj = getById(45, myArray);
    console.log(get_my_obj);

过滤我们的对象。然而,经过一些测试,我意识到我没有得到我需要的结果,我注意到如果我这样添加[0]

return myArray.filter(function(obj) {
      if(obj.id == id) {
        return obj 
      }
    })[0]

问题

这完美无缺。为什么我需要[0]

4 个答案:

答案 0 :(得分:4)

Array.prototype.filter 过滤一个数组;它从数组中删除不适合您的谓词的元素。结果是一个数组,大概比你开始的时间短。

您要找的是Array.prototype.find,它仅返回第一个匹配。

答案 1 :(得分:2)

数组过滤器返回一个数组。此数组由原始数组的每一行组成,您的过滤器函数将返回true。

即使数组只有一个条目,它仍然是一个数组

之前:

[0]{'id':'73','foo':'bar'}
[1]{'id':'45','foo':'ye'}

后:

[0]{'id':'45','foo':'ye'}

想一个不同的例子

[0]{'id':'73','foo':'bar'}
[1]{'id':'45','foo':'ye'}
[2]{'id':'32','foo':'ye'}
[3]{'id':'33','foo':'ye'}
[4]{'id':'33','foo':'baz'}

现在该函数可以过滤任何具有值' ye'为foo

[0]{'id':'45','foo':'ye'}
[1]{'id':'32','foo':'ye'}
[2]{'id':'33','foo':'ye'}
你知道吗在这两种情况下,返回的值都是匹配对象的数组。如果我们只返回一个匹配对象(如果我们只有一个匹配({'id':'45','foo':'ye'}),那将会很尴尬。

首先,filter方法必须决定是否返回数组或对象。然后返回值的接收者必须检查该值是数组还是对象。这会很奇怪。

  

filter()为每个元素调用一次提供的回调函数   一个数组,并构造一个 new array 的所有值   callback返回一个强制为true的值。调用回调   仅适用于已分配值的数组索引;它不是   为已删除或从未进行过的索引调用   指定值。不通过回调测试的数组元素   只是被跳过,并且不包含在新数组中。

我很大胆 来自:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

答案 2 :(得分:1)

简而言之Array#filter返回一个数组,其中包含回调返回true的项目。

如果您只期望一个项目,最好使用Array#some并设置索引。

function getById(id, myArray) {
    var index = -1;
    myArray.some(function (obj, i) {
        if (obj.id == id) {
            index = i;
            return true;
        }
    });
    return myArray[index];
}

var myArray = [{ 'id': '73', 'foo': 'bar' }, { 'id': '45', 'foo': 'ye' }],
    get_my_obj = getById(45, myArray);

console.log(get_my_obj);

答案 3 :(得分:0)

假设您的结果是:

[{'id':'73','foo':'bar'}]

这是一个内部只有一个对象的数组。但是,使用索引([0]),您将获得数组中的第一个元素(只有一个)。在这种情况下,对象:

{'id':'73','foo':'bar'}