检查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
。