[javascript] 배열의 모든 값이 같은지 확인하십시오

모든 값이 동일한 배열을 찾아야합니다. 가장 빠른 방법은 무엇입니까? 그것을 반복하고 값을 비교해야합니까?

['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 (MDN에서) :이 every()메소드는 배열의 모든 요소가 제공된 함수로 구현 된 테스트를 통과하는지 테스트합니다.


답변

편집 : 빨간 닌자가 되십시오 :

!!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먼저 확인하고 싶을 수도 있습니다 .


답변

작동합니다. 프로토 타입을 사용하여 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


답변

JavaScript 1.6에서는 다음을 사용할 수 있습니다 Array.every.

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

예를 들어 배열에 요소가없는 경우 일부 위생 검사가 필요할 수 있습니다. (또한 모든 요소가 NaN이후 에는 작동하지 NaN !== NaN않지만 문제가되지는 않습니다 … 그렇습니까?)


답변

어레이를 세트로 전환 할 수 있습니다. Set의 크기가 1과 같으면 Array의 모든 요소가 동일합니다.

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

allEqual(['a', 'a', 'a', 'a']); // true
allEqual(['a', 'a', 'b', 'a']); // false


답변

성능 비교를 위해 벤치마킹도 수행했습니다.

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 ()을 사용하는 것이 샘플링 된 것 중 가장 빠른 방법입니다.


답변

밑줄 / lodash를 사용한 최단 답변

function elementsEqual(arr) {
    return !_.without(arr, arr[0]).length
}

투기:

elementsEqual(null) // throws error
elementsEqual([]) // true
elementsEqual({}) // true
elementsEqual([1]) // true
elementsEqual([1,2]) // false
elementsEqual(NaN) // true

편집하다:

또는 Tom의 답변에서 영감을 얻은 더 짧습니다.

function elementsEqual2(arr) {
    return _.uniq(arr).length <= 1;
}

투기:

elementsEqual2(null) // true (beware, it's different than above)
elementsEqual2([]) // true
elementsEqual2({}) // true
elementsEqual2([1]) // true
elementsEqual2([1,2]) // false
elementsEqual2(NaN) // true