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

我需要find所有值相等的数组。 什么是最快的方法来做到这一点? 我应该循环通过它,只是比较值?

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

编辑:是一个红色的忍者:

 !!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 

这是因为我们不通过初始值 。 所以,你可能希望首先检查array.length

这工作。 您可以使用原型在Array上创build一个方法。

 Array.prototype.allValuesSame = function() { for(var i = 1; i < this.length; i++) { if(this[i] !== this[0]) return false; } return true; } 

以这种方式调用它:

 var a = ['a', 'a', 'a']; var b = a.allValuesSame(); //true a = ['a', 'b', 'a']; b = a.allValuesSame(); //false 
 var 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 (来自MDN):every()方法testing数组中的所有元素是否通过了由提供的函数实现的testing。

在JavaScript 1.6中,您可以使用Array.every

 function AllTheSame(array) { var first = array[0]; return array.every(function(element) { return element === first; }); } 

你可能需要一些理智的检查,例如当数组没有元素时。 (另外,从NaN !== NaN ,所有的元素都是NaN时候,这是行不通的,但这不应该是个问题。

而对于性能比较,我也做了一个基准:

 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()是采样的最快的方法。

使用下划线/ lodash最短的答案

 function elementsEqual(arr) { return !_.without(arr, arr[0]).length } 

规格:

 elementsEqual(null) // throws error elementsEqual([]) // true elementsEqual({}) // true elementsEqual([1]) // true elementsEqual([1,2]) // false elementsEqual(NaN) // true 

编辑:

甚至更短,由汤姆的答案启发:

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

规格:

 elementsEqual2(null) // true (beware, it's different than above) elementsEqual2([]) // true elementsEqual2({}) // true elementsEqual2([1]) // true elementsEqual2([1,2]) // false elementsEqual2(NaN) // true 

如果您已经使用了underscore.js ,那么使用_.uniq的另一个选项_.uniq

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

_.uniq返回数组的非重复版本。 如果所有的值都相同,那么长度将是1。

正如在注释中提到的那样,假设你可能期望一个空数组返回true ,那么你也应该检查这种情况:

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

是的,你可以用下面的filter来检查它,很简单,只要检查每个值是否与第一个值相同:

 //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中的本地数组function,如果你重复使用它:

 //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 

那么,这真的不是很复杂。 我有强烈的怀疑,你甚至没有尝试。 你所做的就是select第一个值,将其保存在variables中,然后在for循环中,将所有后续值与第一个值进行比较。
我故意没有分享任何代码。 查找如何使用以及如何比较variables。

如果支持,您可以使用Array.every

 var equals = array.every(function(value, index, array){ return value === array[0]; }); 

一个循环的替代方法可以是类似的东西

 var temp = array.slice(0).sort(); var equals = temp[0] === temp[temp.length - 1]; 

或者,如果这些项目是这样的问题,就像是一个脏东西:

 var equals = array.join('').split(array[0]).join('').length === 0; 

也有效。

您可以使用Array.prototype.every , Object.is和ES6箭头函数来完成您想要的任务:

 const all = arr => arr.every(x => Object.is(arr[0], x)); 

您可以将arrays变成一个集合。 如果Set的大小等于1,那么Array的所有元素都是相等的。

 function allEqual(arr) { return new Set(arr).size == 1; } allEqual(['a', 'a', 'a', 'a']); // true allEqual(['a', 'a', 'b', 'a']); // false 

我认为最简单的方法是创build一个循环来比较每个值到下一个值。 只要“链条”中断,那么它就会返回假。 如果第一个等于第二个,第二个等于第三个等,那么我们可以得出结论,数组的所有元素都是相等的。

给定一个数组数据[],那么你可以使用:

 for(x=0;x<data.length - 1;x++){ if (data[x] != data[x+1]){ isEqual = false; } } alert("All elements are equal is " + isEqual); 
 arr.length && arr.reduce(function(a, b){return (a === b)?a:false;}) === arr[0]; 

你可以使用这个:

 function same(a) { if (!a.length) return true; return !a.filter(function (e) { return e !== a[0]; }).length; } 

该函数首先检查数组是否为空。 如果它的值是等于的话。否则它过滤数组并且取所有与第一个不同的元素。 如果没有这样的值=>数组只包含相等的元素,否则不包含。

有关这种方法的东西应该工作。

 a.join(',').split(a[0]).length === a.length + 1 

更新新的解决scheme:检查索引

  let a = ['a', 'a', 'b', 'a']; let a = ['a', 'a', 'a', 'a']; let check = (list) => list.every(item => list.indexOf(item) === 0); check(a); // false; check(b); // true; 

用ES6更新:使用list.every是最快的方法:

  let a = ['a', 'a', 'b', 'a']; let check = (list) => list.every(item => item === list[0]); 

旧版:

  var listTrue = ['a', 'a', 'a', 'a']; var listFalse = ['a', 'a', 'a', 'ab']; function areWeTheSame(list) { var sample = list[0]; return (list.every((item) => item === sample)); } 

下划线的_.isEqual(object, other)函数对于数组似乎很好。 数组中项目的顺序在检查相等时很重要。 请参阅http://underscorejs.org/#isEqual

 var listTrue = ['a', 'a', 'a', 'a']; var listFalse = ['a', 'a', 'a', 'ab']; function areWeTheSame(list) { var sample = list[0]; return !(list.some(function(item) { return !(item == sample); })); } 

这很简单。 创build一个函数并传递一个参数。 在该函数中,将第一个索引复制到一个新variables中。 然后创build一个for循环并遍历数组。 在循环内创build一个while循环,检查新创build的variables是否等于循环中的所有元素。 如果它在for循环完成后返回true,否则在while循环内返回false。

 function isUniform(arra){ var k=arra[0]; for (var i = 0; i < arra.length; i++) { while(k!==arra[i]){ return false; } } return true; } 

简单的一行解决scheme,只需将其与第一个条目填充的数组进行比较即可。

 if(arr.join('') === Array(arr.length).fill(arr[0]).join('')) 

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

(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 

就这样。