[javascript] 배열 요소의 발생 횟수 / 횟수 계산

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