Javascript:如何检查对象数组是否有一个且只有一个具有给定值的项?

Javascript:如何检查对象数组是否有一个且只有一个具有给定值的项?,javascript,arrays,ecmascript-6,lodash,Javascript,Arrays,Ecmascript 6,Lodash,我知道,在Javascript中,我可以使用数组上的.some或.every来检查它们是否至少有一个项或通过所提供函数实现的测试的每个项 以下是一些例子: [2, 5, 8, 1, 4].some(x => x > 10); // false [12, 5, 8, 1, 4].some(x => x > 10); // true [12, 5, 8, 130, 44].every(x => x >= 10); // false [12, 54, 18, 1

我知道,在Javascript中,我可以使用数组上的
.some
.every
来检查它们是否至少有一个项或通过所提供函数实现的测试的每个项

以下是一些例子:

[2, 5, 8, 1, 4].some(x => x > 10);  // false
[12, 5, 8, 1, 4].some(x => x > 10); // true

[12, 5, 8, 130, 44].every(x => x >= 10); // false
[12, 54, 18, 130, 44].every(x => x >= 10); // true
我想检查数组是否有“一个且只有一个”项通过给定函数。 我想有一些方法如下:

[12, 5, 12, 13, 4].oneAndOnlyOne(x => x >= 10); // false
[2, 11, 6, 1, 4].oneAndOnlyOne(x => x >= 10); // true

您是否知道任何新的ECMA脚本6方法或任何简单/快速的方法,甚至使用
lodash
,来检查数组中是否存在一个且仅一个具有特定值的项?

您可以使用
数组#过滤器
获得所需的结果

constoneandonlyone=arr=>arr.filter(v=>v>=10).length==1;
log(一个且仅一个([12,5,12,13,4]);

log(一个和唯一一个([2,11,6,1,4])
尝试使用
过滤器
并将数组长度与
1
匹配。然后使用添加了
数组的回调方法。prototype.oneAndOnlyOne

Array.prototype.oneAndOnlyOne=function(回调){
返回此.filter(回调).length==1
}
console.log([12,11,6,1,4].oneAndOnlyOne(x=>x>=10))//false

console.log([2,11,6,1,4].oneAndOnlyOne(x=>x>=10))//true
您可以向数组中添加函数(因为它毕竟是一个对象):


最有效的解决方案可能是简单循环:

function findOne(arr) {
  var foundOne = false;
  for(var i = 0; i < arr.length; ++i) {
    if(arr[i] > 10)
      if(foundOne) return false;
      else foundOne = true;
  }
  return foundOne;
}
函数findOne(arr){
var-foundOne=false;
对于(变量i=0;i10)
如果(foundOne)返回false;
else foundOne=true;
}
返回foundOne;
}

有一些工具已经做到了这一点。比如说。您只需找到一个适合自己的数组。

在找到第一个匹配的点对数组进行切片,然后在数组的其余部分进行搜索,如中所示

功能一和唯一(arr,fn){
const pos=arr.findIndex(fn);
返回位置>=0&!arr.slice(位置+1).find(fn);
}
常量测试=[[12,5,12,13,4],[2,11,6,1,4],[1,2,3];
用于(测试的常数测试)

log(字符串(test),oneAndOnlyOne(test,x=>x>=10))
[…].filter(x=>x>10).length==1
这将把函数应用于数组中的每个元素,理论上这可能是一个问题,因为元素太多,或者函数太昂贵。
function findOne(arr) {
  var foundOne = false;
  for(var i = 0; i < arr.length; ++i) {
    if(arr[i] > 10)
      if(foundOne) return false;
      else foundOne = true;
  }
  return foundOne;
}