JavaScript在Array中查找单个元素

时间:2018-06-14 08:36:00

标签: javascript arrays linq

.NET的LINQ包含一个运算符.Single

  

返回序列的唯一元素,如果序列中没有一个元素,则抛出异常。

最新版本的JavaScript中是否有相应的内容? (ECMA v8撰写时)。

我能找到的最接近的操作是.find,但是必须编写自己的样板来断言恰好有一个elemet匹配。

.single()的预期功能示例:

const arr = [1, 4, 9];
arr.single(v => v > 8 && v < 10);   // Returns 9
arr.single(v => v < 5);             // Throws an exception since more than one matches
arr.single(v => v > 10);            // Throws an exception since there are zero matches

3 个答案:

答案 0 :(得分:1)

  

最新版本的JavaScript中是否有相应的内容? (ECMA v8撰写时)。

不,不是。

您可以更改Array的原型(这是不可取的)并添加一个过滤数组并返回单个找到的项或抛出错误的方法。

Array.prototype.single = function (cb) {
    var r = this.filter(cb);
    if (!r.length) {
        throw 'zero match';
    }
    if (r.length !== 1) {
        throw 'too much matches';
    }
    return r[0];
};

const arr = [1, 4, 9];
console.log(arr.single(v => v > 8 && v < 10)); // 9
console.log(arr.single(v => v < 5));           // exception since more than one matches
// console.log(arr.single(v => v > 10));       // exception since there are zero matches

或者您可以使用link.js

const arr = [1, 4, 9];
console.log(Enumerable.From(arr).Single(v => v > 8 && v < 10)); // 9
console.log(Enumerable.From(arr).Single(v => v < 5));           // exception since more than one matches
// console.log(Enumerable.From(arr).Single(v => v > 10));       // exception since there are zero matches
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

答案 1 :(得分:0)

本机JS中不存在这样的功能,但编写自己的功能完成同样的事情是非常简单的:

&#13;
&#13;
const single = (arr, test) => {
  let found;
  for (let i = 0, l = arr.length; i < l; i++) {
    if (test(arr[i])) {
      if (found !== undefined) throw new Error('multiple matches found');
      found = arr[i];
    }
  }
  if (!found) throw new Error('no matches found');
  console.log('found: ' + found);
  return found;
}

const arr = [1, 4, 9];
single(arr, v => v > 8 && v < 10);   // Returns 9
single(arr, v => v < 5);             // Throws an exception since more than one matches
single(arr, v => v > 10);            // Throws an exception since there are zero matches
&#13;
&#13;
&#13;

假设您实际上没有测试undefined,在这种情况下您不得不再写一些代码

答案 2 :(得分:0)

使用https://www.npmjs.com/package/manipula,您可以按照LINQ样式进行操作:

Manipula.from([1, 4, 9]).single(v=> v>8 && v<10)