我需要找到所有值都相等的数组。最快的方法是什么?我应该循环遍历它,然后比较值吗?

['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false

当前回答

如果你已经在使用underscore.js,那么这里有另一个使用_.uniq的选项:

function allEqual(arr) {
    return _.uniq(arr).length === 1;
}

_。Uniq返回数组的无重复版本。如果所有值都相同,则长度为1。

正如评论中提到的,假设你希望一个空数组返回true,那么你也应该检查这种情况:

function allEqual(arr) {
    return arr.length === 0 || _.uniq(arr).length === 1;
}

其他回答

在PHP中,有一个非常简单的解决方案,一行方法:

(count(array_count_values($array)) == 1)

例如:

$arr1 = ['a', 'a', 'a', 'a'];
$arr2 = ['a', 'a', 'b', 'a'];


print (count(array_count_values($arr1)) == 1 ? "identical" : "not identical"); // identical
print (count(array_count_values($arr2)) == 1 ? "identical" : "not identical"); // not identical

这是所有。

是的,你也可以使用过滤器检查它,如下所示,非常简单,检查每个值都与第一个相同:

//ES6
function sameValues(arr) {
  return arr.filter((v,i,a)=>v===a[0]).length === arr.length;
} 

也可以使用数组上的每个方法:

//ES6
function sameValues(arr) {
  return arr.every((v,i,a)=>v===a[0]);
} 

你可以像下面这样检查你的数组:

sameValues(['a', 'a', 'a', 'a']); // true
sameValues(['a', 'a', 'b', 'a']); // false

或者,如果你经常重用它,你可以将它添加到JavaScript的原生数组功能中:

//ES6
Array.prototype.sameValues = Array.prototype.sameValues || function(){
 this.every((v,i,a)=>v===a[0]);
}

你可以像下面这样检查你的数组:

['a', 'a', 'a', 'a'].sameValues(); // true
['a', 'a', 'b', 'a'].sameValues(); // false

您可以将数组转换为Set并检查其大小

对于基元数组条目,即number, string:

const isArrayWithEqualEntries = array => new Set(array).size === 1

如果对象数组中有一些字段需要测试是否等价,则输入id:

const mapper = ({id}) => id
const isArrayWithEqualEntries = array => new Set(array.map(mapper)).size === 1
arr.length && arr.reduce(function(a, b){return (a === b)?a:false;}) === arr[0];

您可以将Array转换为Set。如果Set的大小等于1,则数组中的所有元素都相等。

function allEqual(arr) {
  return new Set(arr).size == 1;
}

allEqual(['a', 'a', 'a', 'a']); // true
allEqual(['a', 'a', 'b', 'a']); // false