我的尝试
嗨,我们可以做点什么
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]
?
答案 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'}