检查数组的所有值是否相等
我需要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
就这样。