272

すべての値が等しい配列を見つける必要があります。これを行う最速の方法は何ですか? それをループして値を比較するだけですか?

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

32 に答える 32

63

これは機能します。プロトタイプを使用して 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
于 2013-02-12T12:33:00.847 に答える
53

配列をセットに変えることができます。Set のサイズが 1 の場合、Array のすべての要素は等しくなります。

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

allEqual(['a', 'a', 'a', 'a']); // true
allEqual(['a', 'a', 'b', 'a']); // false
于 2017-08-01T10:31:52.740 に答える
32

JavaScript 1.6では、次を使用できますArray.every

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

配列に要素がない場合など、おそらくいくつかの健全性チェックが必要です。(また、すべての要素がNaN以降NaN !== NaNの場合、これは機能しませんが、それは問題ではないはずです...そうですか?)

于 2013-02-12T12:39:49.633 に答える
16

パフォーマンスの比較のために、ベンチマークも行いました。

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() を使用することが、サンプリングされたものの中で最速の方法です。

于 2014-01-21T19:10:33.717 に答える
5

Array.everyサポートされている場合は、次を使用できます。

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

ループの代替アプローチは次のようなものになる可能性がありますsort

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

または、アイテムが質問のようなものである場合、次のような汚いもの:

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

また、動作します。

于 2013-02-12T13:04:11.487 に答える
3
arr.length && arr.reduce(function(a, b){return (a === b)?a:false;}) === arr[0];
于 2015-02-09T23:27:24.617 に答える
2

これを使用できます:

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

この関数は、最初に配列が空かどうかをチェックします。そうでない場合は、配列をフィルタリングし、最初の要素とは異なるすべての要素を取得します。そのような値がない場合 => 配列には等しい要素のみが含まれます。それ以外の場合は含まれません。

于 2013-02-12T12:35:14.580 に答える
2

for ループを使用できます。

function isEqual(arr) {
  var first = arr[0];
  for (let i = 1; i < arr.length; i++) {
    if (first !== arr[i]) {
      return false;
    }
  }
  return true;
}
于 2020-06-06T14:45:33.247 に答える
1
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);
    }));
}
于 2015-05-04T10:38:27.430 に答える
-1

シンプルな 1 行のソリューションです。最初のエントリで満たされた配列と比較するだけです。

if(arr.join('') === Array(arr.length).fill(arr[0]).join(''))
于 2016-07-29T13:27:32.430 に答える