我想知道是否有办法改善这个功能的优雅:
function findById(id) {
var items = [
{ Id: 1, Value: 'My value 1' },
{ Id: 2, Value: 'My value 2' }
];
var result = $.grep(items, function (obj) { return obj.Id === id; });
return result.length > 0 ? result[0] : null;
}
特别是,我觉得它看起来像这样:
function findById(id) {
var items = [
{ Id: 1, Value: 'My value 1' },
{ Id: 2, Value: 'My value 2' }
];
return $.grep(items, function (obj) { return obj.Id === id; })[0] || null;
}
这显然是一大堆失败,但这个想法是,也许有一种更清晰的方式来编写这个功能。没什么大不了的,但我想我会写这个,以防万一我错过了。
[编辑]正如所指出的,理想的代码工作得很好。我错误地假设访问空数组的第一个元素会引发错误,但它返回undefined。谢谢大家!
答案 0 :(得分:2)
您的'理想'代码运行正常。在C#中,此功能称为FirstOrDefault
。
目前还没有内置于JavaScript(或jQuery afaik)中it will likely be added,而是下一版本。
我们的好朋友Florian写了一个小函数,可以让你使用你想要的语法or
。
这是:
function or(arr, callback, context) {
var el;
for (var i = 0, l = arr.length; i < l; i++) {
el = arr[i];
if (callback.call(context, el, i, arr)) {
return el;
}
}
return null;//to return null and not undefined
}
示例:
or([1,2,3],function(elem){ return i>2;}); //returns 3;
or([1,2,3],function(elem){ return i>3;}); //returns null;
or([1,2,3],function(elem){ return i>1;}); //returns 2;
在您的示例中,那将是
return or(items, function (obj) { return obj.Id === id; });
一个优点是,如果它在中间找到匹配项,它将不会遍历整个数组。如果您的阵列很大,这是一个很大的区别。