すべての値が等しい配列を見つける必要があります。これを行う最速の方法は何ですか? それをループして値を比較するだけですか?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
すべての値が等しい配列を見つける必要があります。これを行う最速の方法は何ですか? それをループして値を比較するだけですか?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
これは機能します。プロトタイプを使用して 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
配列をセットに変えることができます。Set のサイズが 1 の場合、Array のすべての要素は等しくなります。
function allEqual(arr) {
return new Set(arr).size == 1;
}
allEqual(['a', 'a', 'a', 'a']); // true
allEqual(['a', 'a', 'b', 'a']); // false
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() を使用することが、サンプリングされたものの中で最速の方法です。
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;
また、動作します。
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;
}
この関数は、最初に配列が空かどうかをチェックします。そうでない場合は、配列をフィルタリングし、最初の要素とは異なるすべての要素を取得します。そのような値がない場合 => 配列には等しい要素のみが含まれます。それ以外の場合は含まれません。
for ループを使用できます。
function isEqual(arr) {
var first = arr[0];
for (let i = 1; i < arr.length; i++) {
if (first !== arr[i]) {
return false;
}
}
return true;
}
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);
}));
}
シンプルな 1 行のソリューションです。最初のエントリで満たされた配列と比較するだけです。
if(arr.join('') === Array(arr.length).fill(arr[0]).join(''))