Javascript에서는 숫자 값의 초기 배열을 가져 와서 그 안의 요소를 계산하려고합니다. 이상적으로 결과는 두 개의 새로운 배열이며, 첫 번째는 고유 한 각 요소를 지정하고 두 번째는 각 요소가 발생하는 횟수를 포함합니다. 그러나 나는 출력 형식에 대한 제안에 열려 있습니다.
예를 들어 초기 배열이 다음과 같은 경우
5, 5, 5, 2, 2, 2, 2, 2, 9, 4
그런 다음 두 개의 새로운 배열이 생성됩니다. 첫 번째는 각 고유 요소의 이름을 포함합니다.
5, 2, 9, 4
두 번째는 요소가 초기 배열에서 발생한 횟수를 포함합니다.
3, 5, 1, 1
초기 배열에서 숫자 5가 3 번 발생하기 때문에 숫자 2는 5 번 발생하고 9와 4는 모두 한 번 나타납니다.
나는 해결책을 많이 찾았지만 아무것도 효과가없는 것 같습니다. 내가 시도한 모든 것이 엄청나게 복잡해졌습니다. 도움을 주시면 감사하겠습니다!
감사 🙂
답변
여기 있습니다 :
function foo(arr) {
var a = [], b = [], prev;
arr.sort();
for ( var i = 0; i < arr.length; i++ ) {
if ( arr[i] !== prev ) {
a.push(arr[i]);
b.push(1);
} else {
b[b.length-1]++;
}
prev = arr[i];
}
return [a, b];
}
라이브 데모 : http://jsfiddle.net/simevidas/bnACW/
노트
이것은 다음을 사용하여 원래 입력 배열의 순서를 변경합니다
Array.sort
답변
객체를 사용하여 결과를 보유 할 수 있습니다.
var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
var counts = {};
for (var i = 0; i < arr.length; i++) {
var num = arr[i];
counts[num] = counts[num] ? counts[num] + 1 : 1;
}
console.log(counts[5], counts[2], counts[9], counts[4]);
이제 counts 객체는 특정 숫자의 개수를 알려줍니다.
console.log(counts[5]); // logs '3'
멤버 배열을 얻으려면 keys()
함수를 사용하십시오.
keys(counts); // returns ["5", "2", "9", "4"]
답변
var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4].reduce(function (acc, curr) {
if (typeof acc[curr] == 'undefined') {
acc[curr] = 1;
} else {
acc[curr] += 1;
}
return acc;
}, {});
// a == {2: 5, 4: 1, 5: 3, 9: 1}
답변
밑줄이나 lodash를 사용하는 경우 가장 간단한 방법입니다.
_.countBy(array);
그런 :
_.countBy([5, 5, 5, 2, 2, 2, 2, 2, 9, 4])
=> Object {2: 5, 4: 1, 5: 3, 9: 1}
다른 사람들이 지적했듯이 결과 에서 _.keys()
and _.values()
함수 를 실행 하여 고유 숫자와 그 발생을 각각 얻을 수 있습니다. 그러나 내 경험상 원래의 객체는 다루기가 훨씬 쉽습니다.
답변
결과에 두 개의 배열을 사용하지 말고 객체를 사용하십시오.
a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
result = { };
for(var i = 0; i < a.length; ++i) {
if(!result[a[i]])
result[a[i]] = 0;
++result[a[i]];
}
그러면 다음 result
과 같이 보일 것입니다 :
{
2: 5,
4: 1,
5: 3,
9: 1
}
답변
ECMAScript2015 옵션은 어떻습니까?
const a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
const aCount = new Map([...new Set(a)].map(
x => [x, a.filter(y => y === x).length]
));
aCount.get(5) // 3
aCount.get(2) // 5
aCount.get(9) // 1
aCount.get(4) // 1
이 예제는 입력 배열을 Set
생성자에 전달하여 고유 한 값 의 모음을 만듭니다 . 확산 구문은 우리가 호출 할 수 있도록 다음 새 배열에이 값을 확장 map
와의 2 차원 배열로 번역 [value, count]
쌍 – 즉, 다음과 같은 구조 :
Array [
[5, 3],
[2, 5],
[9, 1],
[4, 1]
]
그런 다음 새 배열이 Map
생성자에 전달되어 반복 가능한 객체가 생성됩니다 .
Map {
5 => 3,
2 => 5,
9 => 1,
4 => 1
}
약의 좋은 점 Map
말을하는 것입니다 – 객체는 데이터 유형을 보존한다는 것입니다 aCount.get(5)
반환 3
하지만 aCount.get("5")
반환됩니다 undefined
. 또한 모든 값 / 유형이 핵심 역할을하도록하여이 솔루션이 객체 배열에서도 작동 함을 의미합니다.
답변
이것이 배열에서 동일한 값으로 발생을 계산하는 가장 간단한 방법이라고 생각합니다.
var a = [true, false, false, false];
a.filter(function(value){
return value === false;
}).length