我需要找到所有值都相等的数组。最快的方法是什么?我应该循环遍历它,然后比较值吗?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
我需要找到所有值都相等的数组。最快的方法是什么?我应该循环遍历它,然后比较值吗?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
当前回答
为了进行性能比较,我还做了一个基准测试:
function allAreEqual(array){
if(!array.length) return true;
// I also made sure it works with [false, false] array
return array.reduce(function(a, b){return (a === b)?a:(!b);}) === array[0];
}
function same(a) {
if (!a.length) return true;
return !a.filter(function (e) {
return e !== a[0];
}).length;
}
function allTheSame(array) {
var first = array[0];
return array.every(function(element) {
return element === first;
});
}
function useSome(array){
return !array.some(function(value, index, array){
return value !== array[0];
});
}
结果:
allAreEqual x 47,565 ops/sec ±0.16% (100 runs sampled)
same x 42,529 ops/sec ±1.74% (92 runs sampled)
allTheSame x 66,437 ops/sec ±0.45% (102 runs sampled)
useSome x 70,102 ops/sec ±0.27% (100 runs sampled)
所以显然使用内置array.some()是采样中最快的方法。
其他回答
你可以使用for循环:
function isEqual(arr) {
var first = arr[0];
for (let i = 1; i < arr.length; i++) {
if (first !== arr[i]) {
return false;
}
}
return true;
}
公认的答案很好,但我想补充一点。对我来说,使用===行不通,因为我在比较对象数组的数组,但是在我的应用程序中,我一直在使用我强烈推荐的fast-deep-equal包。这样,我的代码看起来就像这样:
let areAllEqual = arrs.every((val, i, arr) => equal(val, arr[0]) );
我的数据是这样的:
[
[
{
"ID": 28,
"AuthorID": 121,
"VisitTypeID": 2
},
{
"ID": 115,
"AuthorID": 121,
"VisitTypeID": 1
},
{
"ID": 121,
"AuthorID": 121,
"VisitTypeID": 1
}
],
[
{
"ID": 121,
"AuthorID": 121,
"VisitTypeID": 1
}
],
[
{
"ID": 5,
"AuthorID": 121,
"VisitTypeID": 1
},
{
"ID": 121,
"AuthorID": 121,
"VisitTypeID": 1
}
]
]
编辑:做一个红色忍者:
!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
结果:
var array = ["a", "a", "a"] => result: "true"
var array = ["a", "b", "a"] => result: "false"
var array = ["false", ""] => result: "false"
var array = ["false", false] => result: "false"
var array = ["false", "false"] => result: "true"
var array = [NaN, NaN] => result: "false"
警告:
var array = [] => result: TypeError thrown
这是因为我们没有传递initialValue。所以,你可能希望检查数组。第一个长度。
const allEqual = arr => arr.every( v => v === arr[0] )
allEqual( [1,1,1,1] ) // true
或一行程序:
[1,1,1,1].every( (val, i, arr) => val === arr[0] ) // true
Array.prototype.every (from MDN): every()方法测试数组中的所有元素是否都通过了由提供的函数实现的测试。
通过加入数组创建一个字符串。 通过重复给定数组的第一个字符创建字符串 匹配两个字符串
函数checkArray(数组){ 返回array.join("") == array[0].repeat(array.length); } console.log('数组:(,,,):”+ checkArray ([' a ', ' ', ' ', ' '))); console.log('数组:[a, a, b, a]: ' + checkArray ([' a ', ' ', ' b ', ' ')));
这样你就完成了!