我需要找到所有值都相等的数组。最快的方法是什么?我应该循环遍历它,然后比较值吗?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
我需要找到所有值都相等的数组。最快的方法是什么?我应该循环遍历它,然后比较值吗?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
当前回答
arr.length && arr.reduce(function(a, b){return (a === b)?a:false;}) === arr[0];
其他回答
你可以使用for循环:
function isEqual(arr) {
var first = arr[0];
for (let i = 1; i < arr.length; i++) {
if (first !== arr[i]) {
return false;
}
}
return true;
}
我认为最简单的方法是创建一个循环来比较每个值和下一个值。只要“链”中有断点,它就会返回false。如果第一个元素等于第二个元素,第二个元素等于第三个元素,以此类推,那么我们可以得出这样的结论:数组中的所有元素彼此相等。
给定一个数组data[],那么你可以使用:
for(x=0;x<data.length - 1;x++){
if (data[x] != data[x+1]){
isEqual = false;
}
}
alert("All elements are equal is " + isEqual);
公认的答案很好,但我想补充一点。对我来说,使用===行不通,因为我在比较对象数组的数组,但是在我的应用程序中,我一直在使用我强烈推荐的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
}
]
]
如果你已经在使用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;
}
你可以使用Array.prototype让这一行代码做你想做的事情。每一个对象。和ES6箭头函数:
const all = arr => arr.every(x => Object.is(arr[0], x));