我知道,在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,来检查数组中是否有一个和一个唯一出现的具有特定值的项?
发布于 2017-07-12 08:36:53
您可以使用Array#filter达到所需的结果。
const oneAndOnlyOne = arr => arr.filter(v => v >= 10).length == 1;
console.log(oneAndOnlyOne([12, 5, 12, 13, 4]));
console.log(oneAndOnlyOne([2, 11, 6, 1, 4]));
发布于 2017-07-12 08:48:05
最有效的解决方案可能是简单的循环:
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;
}已经有一些工具可以做到这一点。比如兰达。你可以找到一个适合你的。
发布于 2017-07-15 13:24:54
在找到第一个匹配点时将数组切片,然后在数组的其余部分进行搜索,如
function oneAndOnlyOne(arr, fn) {
const pos = arr.findIndex(fn);
return pos >= 0 && !arr.slice(pos + 1).find(fn);
}
const tests = [[12, 5, 12, 13, 4], [2, 11, 6, 1, 4], [1, 2, 3]];
for (const test of tests)
console.log(String(test), oneAndOnlyOne(test, x => x >= 10));
https://stackoverflow.com/questions/45052433
复制相似问题