모든 값이 동일한 배열을 찾아야합니다. 가장 빠른 방법은 무엇입니까? 그것을 반복하고 값을 비교해야합니까?
['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
