JavaScript数组的every和some有什么区别?

26

在给定测试时,我看到两者都会返回true或false。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/some

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/every

在什么情况下应该同时使用它们?

测试代码:

function checkUsersValid(goodUsers) {
  return function allUsersValid(submittedUsers) {
    //Im testing arrays here
    return submittedUsers.every(function isBigEnough(element, index, array) {
   return goodUsers.some(function (el, i, arr) {
    return element.id == el.id;
   });
 });
  };
}

var goodUsers = [
      { id: 1 },
      { id: 2 },
      { id: 3 }
    ];
    
var testAllValid = checkUsersValid(goodUsers);

testAllValid([
      { id: 2 },
      { id: 1 }
    ]);


请提供您使用的代码,并解释发生了什么以及您本来期望发生什么。这两者都有可能返回true。 - Simon McLoughlin
将代码添加到帖子中。 - STEEL
8个回答

65

(如果您了解C# LINQ,那么它就像AnyAll)

  • some会在任何一个谓词为true时返回true

  • every会在所有谓词均为true时返回true

其中,谓词是指对每个元素返回bool(true/false)的函数

every会在第一个false时返回。
some会在第一个true时返回。


8
@PavelGatnar,你在哪里看到我告诉他应该知道LINQ呢?我说的是“如果”,作为另一种语言中的参考示例。而且,我的解释非常清晰,不需要了解C#也能理解。 - Royi Namir
两种方法都在发现第一个 falsy 值时立即返回 false,那它们之间有什么区别呢?every() 方法应迭代所有元素直到结尾再返回。 - Rajan Verma - Aarvy
1
@Aarvy every 在第一个 false 时返回。some 在第一个 true 时返回。 - Royi Namir
顺便问一下,为什么名称是 every 和 some?它应该是 any 和 all,因为它们更清晰明了。这是不是可能会破坏现有网站的问题? - sktguha
1
@sktguha 请看下面的答案,我认为很有道理 https://dev59.com/GVwZ5IYBdhLWcg3wIdV8#31809738 - James

21

some是类比于逻辑中的操作符
every是类比于逻辑中的操作符

逻辑上,every蕴含着some,但反过来则不成立

试试这个:

var identity = function(x){return x}
console.log([true, true].some(identity))//true
console.log([true, true].every(identity))//true
console.log([true, false].some(identity))//true
console.log([true, false].every(identity))//false
console.log([false, false].some(identity))//false
console.log([false, false].every(identity))//false
console.log([undefined, true].some(identity))//true
console.log([undefined, true].every(identity))//false
console.log([undefined, false].some(identity))//false
console.log([undefined, false].every(identity))//false
console.log([undefined, undefined].some(identity))//false
console.log([undefined, undefined].every(identity))//false

1
我不是那个给你点踩的人,但我认为你应该添加控制台日志的实际结果:例如:console.log(1+1)//2。顺便加一。 - Royi Namir
这是一个非常好的解释,也是最容易记住的方法。+1 - Gavara.Suneel

6
文档回答了你的问题...
"some()"方法测试数组中是否有元素通过提供的函数实现的测试。
"every()"方法测试数组中的所有元素是否都通过提供的函数实现的测试。
所以,如果你想测试“some”元素或“every”元素,就会使用它们。
如果“every()返回true”,那么“some()也返回true”。
但是,
如果“some()返回true”,那么我们不能得出任何关于“every()”结果的结论。

2

Array.prototype.some非常适合查找入侵者或遗留物,也就是说,您只需要知道是否至少有一个满足您的限制条件。

另一方面,Array.prototype.every用于检查数组的完整性,例如,“我的数组中的所有项都是Car的实例吗?”。


1

摘要:

  • 使用Array.prototype.some来查找数组中是否有一个特定元素符合布尔条件。
  • 使用Array.prototype.every来查找数组中所有元素是否都符合布尔条件。

示例:

const array = [1, 2, 3, 4, 5];
const evenArr = [2, 4, 6];

const even = (element) => {
  return element % 2 === 0;
};

console.log(array.some(even));    // true
console.log(array.every(even))    // false
console.log(evenArr.every(even))  // true


1

让我告诉你一个秘密.....

它们其实是一样的*

一个只是另一个的否定版本。我们都有它们,因为这很方便。

const arr = [1, 2, 3, 4]

const lte5 = value => value <= 5 // Less than or Equal

const every = arr.every(v => lte5(v))
const some = !arr.some(v => !lte5(v))

console.log('Are they same?', every === some)

请跟我读:

“对于一个数组[1, 2, 3, 4],...

1)every

... '每个项目都小于或等于5'是正确的

2)some

... '一些项目小于或等于5'是不正确的


为了证明第一个语句是错误的,我们需要找到至少一个(或者"一些")项目不符合条件。这就是为什么every会在第一个项目失败时返回false并停止运行。如果所有项目都通过条件,它将遍历整个数组。

为了证明第二个语句是错误的,我们需要验证“每个”项目都不通过条件。这就是为什么some会在第一个项目通过条件时返回true并停止运行。如果所有项目都未通过条件,它将遍历整个数组。


在下面的代码片段中,请注意everysome都运行了四次,即直到数组[1, 2, 3, 4]的末尾。

const arr = [1, 2, 3, 4]

const lte5 = value => value <= 5

console.log('Checking that every item is smaller than or equal 5.')
const every = arr.every((v, ix) => {
    const result = lte5(v)
    console.log(`${ix}: is`, v, '<= 5 ?', result)
    return result
})

console.log('is every item <= 5 ?', every)

console.log('Checking that some item is larger than 5. (i.e. NOT smaller than or equal 5)')
const some = arr.some((v, ix) => {
    const result = !lte5(v)
    console.log(`${ix}: is`, v, '> 5 ?', result)
    return result
})

console.log('is some item > 5', some)
console.log('is every item <= 5 ?', !some)


1

Array.prototype.every()的简单示例: every()方法测试提供的函数实现的条件是否适用于数组中的所有元素。

注意:该方法对空数组放置任何条件都返回true。

function lessThanTwenty(currentValue) {
  return currentValue < 20;
}

let array = [1, 30, 39, 29, 10, 19];

console.log(array.every(lessThanTwenty));

//output : false

Array.prototype.some()的简单示例:

some()方法测试数组中是否有至少一个元素通过提供的函数实现的测试。

注意:对于在空数组上放置任何条件,此方法返回false。

let array2 = [1, 2, 3, 4, 5];

let even = function(ele) { 
  return ele % 2 === 0;
};

console.log(array.some(even));
// output: true

0

每个方法:如果所有数组元素都满足我们的条件,则返回true。 一些方法:如果一个或多个数组元素满足我们的条件,则返回false。 这非常简单。

// Every & Some
const num1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const num2 = [2, 4, 6, 8, 10];

const everyMethod = num1.every(myFunction);
const sumMethod = num1.some(myFunction);

function myFunction(value) {
    return value > 3;
}
console.log(everyMethod);//Retun false
console.log(sumMethod);//Return True


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接