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

IT技术 javascript jquery
2021-01-19 21:56:59

我需要找到所有值都相等的数组。执行此操作的最快方法是什么?我应该遍历它并只比较值吗?

['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
6个回答
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(来自MDN):该every()方法测试数组中的所有元素是否通过提供的函数实现的测试。

使用some代替every: arr.some( v => v !== arr[0] )这将在发现不等于 的第一个元素时尽早返回arr[0]
2021-03-21 21:56:59
@Janevery也提前回来了。
2021-03-27 21:56:59
简洁是智慧的灵魂
2021-03-28 21:56:59
我创建了一个 jsperf 案例这种方法优于大多数候选人。
2021-04-07 21:56:59
const everythings_equal = array => array.every(thing => thing === array[0]);
2021-04-08 21:56:59

编辑:成为红色忍者:

!!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所以,你不妨先检查一下array.length

聚会可能有点晚了……我认为如果您的数组由falses组成,这将不起作用例如尝试 [false, false, false].reduce(function(a, b){return (a === b)?a:false;});
2021-03-13 21:56:59
投反对票如果元素相等但为怎么
2021-03-30 21:56:59
@马丁:["false", ""]返回true:/
2021-04-06 21:56:59
这可以通过使用来提升一个档次NaN由于NaN === NaNNaN !== NaN都是假的,它保证一旦将prev设置为 NaN 则没有任何值可以将其取出。同时添加双重否定将结果转换为trueand false,因为它NaN是假的。最终形式:!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
2021-04-10 21:56:59
我投了反对票,因为这不适用于布尔值。
2021-04-11 21:56:59

这有效。您可以使用原型在 Array 上创建一个方法。

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

以这种方式调用它:

let a = ['a', 'a', 'a'];
let b = a.allValuesSame(); // true
a = ['a', 'b', 'a'];
b = a.allValuesSame();     // false
我不认为给内置原型打补丁是个好主意。如果多个库都这样做,可能会导致异常难以调试的异常行为。
2021-03-12 21:56:59
@MarkWilbur +1 特别是如果您在下一个数组上执行 for..in 循环,您将进入allValuesSame循环
2021-03-16 21:56:59
我继续进行了现代化改造,而没有改变意图。
2021-03-19 21:56:59
非常好,但要注意:IE 不支持这种分配原型的方式。反正我用。
2021-03-22 21:56:59
@TomášZato:IE 支持增强Array.prototype(甚至 IE6)。只有 DOM 元素原型,一些旧版本的 IE 不支持扩充。
2021-03-29 21:56:59

您可以将 Array 转换为 Set。如果 Set 的大小等于 1,则 Array 的所有元素都相等。

function allEqual(arr) {
  return new Set(arr).size == 1;
}

allEqual(['a', 'a', 'a', 'a']); // true
allEqual(['a', 'a', 'b', 'a']); // false
^ 因为两者NaN === NaNNaN == NaN评估为false
2021-03-25 21:56:59
杰出的。请注意,在这种情况下allEqual([NaN, NaN])给出true
2021-04-07 21:56:59

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

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

您可能需要进行一些完整性检查,例如当数组没有元素时。(此外,当所有元素都为NaNafter时,这将不起作用NaN !== NaN,但这应该不是问题......对吗?)