最简洁的方法是使用jQuery grep()来查找匹配?

时间:2013-03-18 16:00:59

标签: jquery

我想知道是否有办法改善这个功能的优雅:

  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。谢谢大家!

1 个答案:

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

一个优点是,如果它在中间找到匹配项,它将不会遍历整个数组。如果您的阵列很大,这是一个很大的区别。