1

我想知道是否有办法提高这个函数的优雅:

  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;
  }

这显然是一大堆失败,但想法是也许有一种更清洁的方法来编写函数。没什么大不了的,但我想我会写下来以防我遗漏了什么。

[编辑] 正如所指出的,理想的代码工作得很好。我错误地认为访问空数组的第一个元素会引发错误,而是返回未定义。谢谢大家!

4

1 回答 1

2

您的“理想”代码工作正常。在 C# 中,此功能称为FirstOrDefault.

这目前没有内置到 JavaScript(或 jQuery afaik)中,但它可能会在下一个版本中添加。

我们的好朋友 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; });

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

于 2013-03-18T16:04:58.743 回答