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

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

当前回答

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()方法测试数组中的所有元素是否都通过了由提供的函数实现的测试。

其他回答

你可以用这个:

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

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

当你使用ES6箭头函数语法时,另一个有趣的方式是:

x = ['a', 'a', 'a', 'a']
!x.filter(e=>e!==x[0])[0]  // true

x = ['a', 'a', 'b', 'a']
!x.filter(e=>e!==x[0])[0] // false

x = []
!x.filter(e=>e!==x[0])[0]  // true

当你不想为数组(x)重用变量时:

!['a', 'a', 'a', 'a'].filter((e,i,a)=>e!==a[0])[0]    // true

IMO之前使用array.every(…)的海报有最干净的解决方案。

你可以使用Array.prototype让这一行代码做你想做的事情。每一个对象。和ES6箭头函数:

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

你可以使用for循环:

function isEqual(arr) {
  var first = arr[0];
  for (let i = 1; i < arr.length; i++) {
    if (first !== arr[i]) {
      return false;
    }
  }
  return true;
}

如果你已经在使用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;
}