Skip to content

检查JavaScript数组的所有值是否相等

在JavaScript中,检查数组的所有元素是否匹配某个条件非常简单。但是如何检查数组的所有值是否相等呢?只需要找到一个合适的值来与数组的其余部分进行比较即可。

按值比较数组元素

使用Array.prototype.every()方法是首先想到的方法,也是正确的方法。由于我们需要将所有元素相互比较,我们可以将第一个元素作为参考值,并将其与数组的其余部分进行比较。

const allEqual = arr => arr.every(val => val === arr[0]);

allEqual([1, 1, 1]); // true
allEqual([1, 1, 2]); // false

使用映射函数比较数组元素

对于更复杂的值,例如对象,您可能希望使用映射函数来比较元素。这样,您可以根据特定属性或自定义比较函数来比较元素。

技术上与之前相同,只是在第一个元素上调用映射函数,然后将其与数组的其余部分进行比较。

const allEqualBy = (arr, fn) =>
  arr.every((val, i) => fn(val, i, arr) === fn(arr[0], 0, arr));

allEqualBy([{ a: 1 }, { a: 1 }, { a: 1 }], obj => obj.a); // true
allEqualBy([{ a: 1 }, { a: 1 }, { a: 2 }], obj => obj.a); // false

allEqualBy函数接受两个参数:一个对象数组和一个函数。它会检查数组中的所有对象是否根据给定的函数返回的值相等。

在第一个例子中,我们传入了一个包含三个对象的数组[{ a: 1 }, { a: 1 }, { a: 1 }]和一个函数obj => obj.a。这个函数会返回对象的a属性的值。由于所有对象的a属性的值都是相等的,所以allEqualBy函数返回true

在第二个例子中,我们传入了一个包含三个对象的数组[{ a: 1 }, { a: 1 }, { a: 2 }]和同样的函数obj => obj.a。由于最后一个对象的a属性的值与前两个对象的值不相等,所以allEqualBy函数返回false