배열에서 가장 많이 발생하는 요소 가져 오기


87

JavaScript 배열에서 가장 많이 발생하는 요소 ( mode ) 를 결정하는 우아한 방법을 찾고 있습니다.

예를 들어

['pear', 'apple', 'orange', 'apple']

'apple'요소는 가장 자주 하나이다.


이 Stackoverflow 질문에서 몇 가지 아이디어를 수정할 수 있습니다. stackoverflow.com/questions/840781/…
Nosredna

나는 솔루션을 너무 자세히 읽지 않았지만 가장 많은 발생이 발생하는 요소가 아니라 가장 많이 발생하는 요소를 결정하기위한 요구 사항을 기반으로 다음과 같은 뉘앙스 (최적화?)를 통합합니까? 그리고 그 뉘앙스는 배열이 반복 될 때 가장 높은 발생과 두 번째로 높은 발생 간의 차이가 반복 할 남은 요소의 수보다 적을 때 계수를 멈출 수 있고, 반복을 멈출 수 있으며, 현재 가장 높은 것이 가장 높은 것입니다.
Dexygen 2010 년

1
또한 이러한 솔루션은 관계를 설명하지 않는 것 같습니다.
Dexygen 2010 년

1
좀 더 작은 다른 솔루션을 찾고있는 경우 stackoverflow.com/questions/40410470/…
daanvanham

답변:


95

이것은 단지 모드입니다. 다음은 빠르고 최적화되지 않은 솔루션입니다. O (n)이어야합니다.

function mode(array)
{
    if(array.length == 0)
        return null;
    var modeMap = {};
    var maxEl = array[0], maxCount = 1;
    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];
        if(modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;  
        if(modeMap[el] > maxCount)
        {
            maxEl = el;
            maxCount = modeMap[el];
        }
    }
    return maxEl;
}

1
멋지지만 문자열에서만 작동합니다. 반드시 제한은 아니지만 고려해야 할 사항입니다.
James

많은 감사합니다. 완전한 솔루션을 기대하지는 않았습니다. 단 한 번의 패스로 문자열과 숫자 모두에서 작동합니다.
vise

1
동점을 처리하기 위해이 알고리즘의 버전을 추가했습니다.
samandmoore 2010-08-10

3
modeMap [el]이 null이 아닌 정의되지 않았기 때문에 [2, 3, 3]을 전달할 때 이상한 숫자를 다이빙했기 때문에`f (modeMap [el] == null)을 if (! modeMap [el])로 바꿔야했습니다.
Naz

1
이 경우 배열에서 가장 먼저 오는 요소 인 타이 브레이커를 사용하는 것이 합리적이라고 생각합니다. 그러나이 알고리즘을 쉽게 변경하여 대부분의 경우 동점을 얻을 수 있습니다.
Wylliam Judd 2011

63

2009 년부터 자바 스크립트에서 몇 가지 개발이있었습니다. 다른 옵션을 추가 할 것이라고 생각했습니다. 나는 그것이 실제로 문제가 될 때까지 효율성에 덜 관심을 가지고 있으므로 "우아한" 코드 (OP에 의해 규정 된대로)에 대한 나의 정의는 가독성을 선호합니다-물론 주관적입니다 ...

function mode(arr){
    return arr.sort((a,b) =>
          arr.filter(v => v===a).length
        - arr.filter(v => v===b).length
    ).pop();
}

mode(['pear', 'apple', 'orange', 'apple']); // apple

이 특정 예에서 집합의 두 개 이상의 요소가 동일한 발생을 갖는 경우 배열에서 가장 최근에 나타나는 요소가 반환됩니다. 또한 원래 배열을 수정한다는 점을 지적 할 가치가 있습니다 Array.slice. 사전 에 전화로 원할 경우 방지 할 수 있습니다 .


편집 : 2015 년 이 발생 했기 때문에 일부 ES6 뚱뚱한 화살표로 예제를 업데이트했으며 예쁘게 보입니다 ... 이전 버전과의 호환성이 걱정된다면 개정 내역 에서 찾을 수 있습니다 .


이것은 대단합니다! 이제 배열에 다른 항목과 동일하게 발생하는 항목이 두 개 이상있는 경우 어떻게 여러 답변을 반환할까요?
크리스탈

모드가 고유하다고 가정한다는 점에서 순진한 데, 둘 이상을 반환해야하는 경우 예쁘지 않은 각 항목의 총 개수를 추적해야합니다. 다음과 같이 시도해 볼 수 있습니다. , 기본 값으로 만 작동한다는 점에서 단순합니다 (그러나 필요한 경우 추가로 조정할 수 있음).
Emissary

15
이것이 우아한 코드가 아니라면 무엇인지 모르겠습니다. 함수형 프로그래밍에 대한 광고와 같습니다.
Sam H.

1
@GoranJakovljevic 더 구체적으로 말할 수 있습니까? 나는 그것이 ES6 화살표 기능 이라고 상상할 것입니다 - 개정 내역에서 이전 버전과 호환되는 예제 를 시도해 보셨습니까 ?
Emissary

당신은 맞습니다, 그것의 화살표 기능. 예, 뒤로는 잘 작동합니다.
Goran Jakovljevic

38

George Jempty's알고리즘 계정에 대한 요청에 따라 수정 된 버전의 Matthew Flaschen's알고리즘을 제안합니다 .

function modeString(array) {
  if (array.length == 0) return null;

  var modeMap = {},
    maxEl = array[0],
    maxCount = 1;

  for (var i = 0; i < array.length; i++) {
    var el = array[i];

    if (modeMap[el] == null) modeMap[el] = 1;
    else modeMap[el]++;

    if (modeMap[el] > maxCount) {
      maxEl = el;
      maxCount = modeMap[el];
    } else if (modeMap[el] == maxCount) {
      maxEl += "&" + el;
      maxCount = modeMap[el];
    }
  }
  return maxEl;
}

이제 기호로 구분 된 모드 요소가있는 문자열을 반환합니다 &. 결과가 수신되면 해당 &요소에서 분할 할 수 있으며 모드를 사용할 수 있습니다 .

또 다른 옵션은 다음과 같이 모드 요소의 배열을 반환하는 것입니다.

function modeArray(array) {
  if (array.length == 0) return null;
  var modeMap = {},
    maxCount = 1,
    modes = [];

  for (var i = 0; i < array.length; i++) {
    var el = array[i];

    if (modeMap[el] == null) modeMap[el] = 1;
    else modeMap[el]++;

    if (modeMap[el] > maxCount) {
      modes = [el];
      maxCount = modeMap[el];
    } else if (modeMap[el] == maxCount) {
      modes.push(el);
      maxCount = modeMap[el];
    }
  }
  return modes;
}

위의 예에서 함수의 결과를 모드 배열로 처리 할 수 ​​있습니다.


1
두 번째 예 (배열 1)에서 당신은 설정할 필요가 없습니다 modes[array[0]]초기 값으로. 이렇게하면 modes. 이것은 트릭을해야합니다var modes = []
vdclouis 2015-04-24

1
이것은 대단합니다! 그러나 두 개의 다른 값을 가진 배열로 이것을 테스트하면 배열의 첫 번째 항목이 두 번 반환됩니다. 확실하지 그 ... 무슨 일이 일어나고 이유
크리스탈

@xgrioux는 vdclouis가이 버그에 대응하기 위해 권장하는 변경을 수행합니다. 즉, [배열 [0]]을 []로 변경합니다.
Dave Haigh

엄격한 평등을 시행 ==하기 위해 ===to의 인스턴스 변경 권장
Len Joseph

16

를 기반으로 밀사 의 ES6 + 응답, 당신은 사용할 수 있습니다 Array.prototype.reduce내가 아주 매끄러운 모습을 생각한다 (배열을 돌연변이 잠재적으로 분류 터지는와 반대) 귀하의 비교를 할 수 있습니다.

const mode = (myArray) =>
  myArray.reduce(
    (a,b,i,arr)=>
     (arr.filter(v=>v===a).length>=arr.filter(v=>v===b).length?a:b),
    null)

기본적으로 null로 설정되어 있습니다. null이 필터링 할 수있는 옵션 인 경우 항상 진실한 응답을 제공하지는 않습니다. 선택적인 두 번째 인수 일 수 있습니다.

다른 다양한 솔루션과 마찬가지로 단점은 '그리기 상태'를 처리하지 않는다는 것입니다. 그러나 이것은 여전히 ​​약간 더 관련된 감소 기능으로 달성 할 수 있습니다.


14
a=['pear', 'apple', 'orange', 'apple'];
b={};
max='', maxi=0;
for(let k of a) {
  if(b[k]) b[k]++; else b[k]=1;
  if(maxi < b[k]) { max=k; maxi=b[k] }
}

이것은 여전히 ​​O (n)이지만 불필요하게 두 번의 패스를 사용합니다.
Matthew Flaschen

2
JavaScript가 전송되기 때문에 작은 솔루션을 보는 것은 항상 흥미 롭습니다.
Nosredna 2009-06-28

Lol 2 빼기 적절한 솔루션;] 불필요하게 두 번의 패스를 수정하여 빠르게 만들었지 만 여전히 작동하며 여전히 가장 짧은 솔루션입니다.
Thinker

b에 대한 각 액세스에는 최소한 log (len (b))가 필요하므로 O (n)은 약간 낙관적
Nicolas78

nicolas78 : 배열이 작 으면 상관 없습니다. 따라서 프로젝트에 따라 다릅니다.
Thinker

7

이 기능을 면접관을위한 퀴즈로 사용하면서 솔루션을 게시합니다.

const highest = arr => (arr || []).reduce( ( acc, el ) => {
  acc.k[el] = acc.k[el] ? acc.k[el] + 1 : 1
  acc.max = acc.max ? acc.max < acc.k[el] ? el : acc.max : el
  return acc  
}, { k:{} }).max

const test = [0,1,2,3,4,2,3,1,0,3,2,2,2,3,3,2]
console.log(highest(test))

6

여기에서 선언적 접근 방식을 시도합니다. 이 솔루션은 각 단어의 발생을 집계하는 개체를 만듭니다. 그런 다음 각 단어의 총 발생 횟수를 개체에서 찾은 가장 높은 값과 비교하여 개체를 배열로 필터링합니다.

const arr = ['hello', 'world', 'hello', 'again'];

const tally = (acc, x) => { 

  if (! acc[x]) { 
    acc[x] = 1;
    return acc;
  } 

  acc[x] += 1;
  return acc;
};

const totals = arr.reduce(tally, {});

const keys = Object.keys(totals);

const values = keys.map(x => totals[x]);

const results = keys.filter(x => totals[x] === Math.max(...values));

당신의 대답은 제발 설명
하리스

필터 루프에서 최대 값을 계산하는 것을 피하고 키-값 맵 문을 제거합니다. 이 답변은 가장 성능이 좋지는 않지만 감속기에서 필터링하는 것만 큼 나쁘지는 않으며 멋지고 읽기 쉬운 imho입니다. const maxValue = Math.max (... Object.values ​​(총계)); const 결과 = keys.filter (x => 합계 [x] === maxValue);
milesaron

3

다른 솔루션을위한 시간 :

function getMaxOccurrence(arr) {
    var o = {}, maxCount = 0, maxValue, m;
    for (var i=0, iLen=arr.length; i<iLen; i++) {
        m = arr[i];

        if (!o.hasOwnProperty(m)) {
            o[m] = 0;
        }
        ++o[m];

        if (o[m] > maxCount) {
            maxCount = o[m];
            maxValue = m;
        }
    }
    return maxValue;
}

간결성이 중요하다면 (그렇지 않다면) :

function getMaxOccurrence(a) {
    var o = {}, mC = 0, mV, m;
    for (var i=0, iL=a.length; i<iL; i++) {
        m = a[i];
        o.hasOwnProperty(m)? ++o[m] : o[m] = 1;
        if (o[m] > mC) mC = o[m], mV = m;
    }
    return mV;
}

존재하지 않는 멤버를 피해야하는 경우 (예 : 희소 배열), 추가 hasOwnProperty 테스트가 필요합니다.

function getMaxOccurrence(a) {
    var o = {}, mC = 0, mV, m;
    for (var i=0, iL=a.length; i<iL; i++) {
        if (a.hasOwnProperty(i)) {
            m = a[i];
            o.hasOwnProperty(m)? ++o[m] : o[m] = 1;
            if (o[m] > mC) mC = o[m], mV = m;
        }
    }
    return mV;
}

getMaxOccurrence([,,,,,1,1]); // 1

여기에 다른 답변은 undefined 를 반환 합니다.


@ Jonah—brevity는 그 자체로 의미가 없으며 일반적으로 코드를 읽고 유지하기 어렵게 만듭니다. 물론 더 자세한 코드가 더 길다고해서 반드시 더 좋은 것은 아닙니다. 그러나 이러한 기준 자체는 명확성 및 유지 관리 성과 같은 훨씬 더 중요한 조치에 의해 제거됩니다.
RobG 2015

분명히 조밀하고 비밀스러운 간결함은 결코 목표가 아닙니다. 그러나 일반적으로 밀도가 거의 동일한 동일한 코드의 두 가지 버전을 고려할 때 짧은 것이 일반적으로 더 명확하고 좋습니다. 나는 그것이 규칙 이라고 말하는 것이 아니라 상관 관계가 강하다. 사실, 가독성과 높은 상관 관계가있는 다른 단일 지표 는 없다고 말하고 싶습니다 . 이것이 모든 프로그래머가 코드 삭제를 좋아하는 이유입니다. 이것이 Code Review의 대부분의 재 작성이 원본보다 짧은 이유입니다.
Jonah


3

O (n) 복잡성으로 수행하는 또 다른 ES6 방법입니다.

const result = Object.entries(
    ['pear', 'apple', 'orange', 'apple'].reduce((previous, current) => {
        if (previous[current] === undefined) previous[current] = 1;
        else previous[current]++;
        return previous;
    }, {})).reduce((previous, current) => (current[1] >= previous[1] ? current : previous))[0];
console.log("Max value : " + result);

2
function mode(arr){
  return arr.reduce(function(counts,key){
    var curCount = (counts[key+''] || 0) + 1;
    counts[key+''] = curCount;
    if (curCount > counts.max) { counts.max = curCount; counts.mode = key; }
    return counts;
  }, {max:0, mode: null}).mode
}

이 솔루션의 문제는 "최대"와 "모드"라는 단어가 맵의 논리의 일부이므로 계산되지 않는다는 것입니다.
Pablo

2

이 문제에 대한 나의 해결책이 있지만 숫자와 새로운 '설정'기능을 사용합니다. 그다지 성능이 좋지는 않지만 확실히 이것을 쓰는 데 많은 재미가 있었고 여러 최대 값을 지원합니다.

const mode = (arr) => [...new Set(arr)]
  .map((value) => [value, arr.filter((v) => v === value).length])
  .sort((a,b) => a[1]-b[1])
  .reverse()
  .filter((value, i, a) => a.indexOf(value) === i)
  .filter((v, i, a) => v[1] === a[0][1])
  .map((v) => v[0])

mode([1,2,3,3]) // [3]
mode([1,1,1,1,2,2,2,2,3,3,3]) // [1,2]

그건 그렇고, 이것을 프로덕션에 사용하지 마십시오. 이것은 단지 ES6 및 배열 함수로만 해결할 수있는 방법의 예시 일뿐입니다.


2

내 해결책은 다음과 같습니다.

function frequent(number){
    var count = 0;
    var sortedNumber = number.sort();
    var start = number[0], item;
    for(var i = 0 ;  i < sortedNumber.length; i++){
      if(start === sortedNumber[i] || sortedNumber[i] === sortedNumber[i+1]){
         item = sortedNumber[i]
      }
    }
    return item
  
}

   console.log( frequent(['pear', 'apple', 'orange', 'apple']))


2

읽기 쉽고 유지 관리가 가능한 코드를 위해 다음과 같이 공유합니다.

function getMaxOcurrences(arr = []) {
  let item = arr[0];
  let ocurrencesMap = {};

  for (let i in arr) {
    const current = arr[i];

    if (ocurrencesMap[current]) ocurrencesMap[current]++;
    else ocurrencesMap[current] = 1;

    if (ocurrencesMap[item] < ocurrencesMap[current]) item = current;
  }

  return { 
    item: item, 
    ocurrences: ocurrencesMap[item]
  };
}

누군가에게 도움이되기를 바랍니다;)!


2

이 솔루션은 동점 인 경우 배열의 여러 요소를 반환 할 수 있습니다. 예를 들어, 배열

arr = [ 3, 4, 3, 6, 4, ];

두 가지 모드 값 : 36.

여기에 해결책이 있습니다.

function find_mode(arr) {
    var max = 0;
    var maxarr = [];
    var counter = [];
    var maxarr = [];

    arr.forEach(function(){
       counter.push(0);
    });

    for(var i = 0;i<arr.length;i++){
       for(var j=0;j<arr.length;j++){
            if(arr[i]==arr[j])counter[i]++; 
       }
    } 


    max=this.arrayMax(counter);   
  
    for(var i = 0;i<arr.length;i++){
         if(counter[i]==max)maxarr.push(arr[i]);
    }

    var unique = maxarr.filter( this.onlyUnique );
    return unique;

  };


function arrayMax(arr) {
      var len = arr.length, max = -Infinity;
      while (len--) {
              if (arr[len] > max) {
              max = arr[len];
              }
      }
  return max;
 };

 function onlyUnique(value, index, self) {
       return self.indexOf(value) === index;
 }

1
var mode = 0;
var c = 0;
var num = new Array();
var value = 0;
var greatest = 0;
var ct = 0;

참고 : ct는 배열의 길이입니다.

function getMode()
{
    for (var i = 0; i < ct; i++)
    {
        value = num[i];
        if (i != ct)
        {
            while (value == num[i + 1])
            {
                c = c + 1;
                i = i + 1;
            }
        }
        if (c > greatest)
        {
            greatest = c;
            mode = value;
        }
        c = 0;
    }
}

1
const mode = (str) => {
  return str
    .split(' ')
    .reduce((data, key) => {
      let counter = data.map[key] + 1 || 1
      data.map[key] = counter

      if (counter > data.counter) {
        data.counter = counter
        data.mode = key
      }

      return data
    }, {
      counter: 0,
      mode: null,
      map: {}
    })
    .mode
}

console.log(mode('the t-rex is the greatest of them all'))

1
function mode(array){
    var set = Array.from(new Set(array));
    var counts = set.map(a=>array.filter(b=>b==a).length);
    var indices = counts.map((a,b)=>Math.max(...counts)===a?b:0).filter(b=>b!==0);
    var mode = indices.map(a=>set[a]);
    return mode;
}

1

시도해보십시오. 이것은 계정 브라우저 버전을 고려하지 않습니다.

function mode(arr){
var a = [],b = 0,occurrence;
    for(var i = 0; i < arr.length;i++){
    if(a[arr[i]] != undefined){
        a[arr[i]]++;
    }else{
        a[arr[i]] = 1;
    }
    }
    for(var key in a){
    if(a[key] > b){
        b = a[key];
        occurrence = key;
    }
    }
return occurrence;
}
alert(mode(['segunda','terça','terca','segunda','terça','segunda']));

이 함수는 2 개 이상의 항목이 동일한 횟수로 나타날 때 배열에서 최신 항목을 반환합니다.


1
// O(n)
var arr = [1, 2, 3, 2, 3, 3, 5, 6];
var duplicates = {};
max = '';
maxi = 0;
arr.forEach((el) => {
    duplicates[el] = duplicates[el] + 1 || 1;
  if (maxi < duplicates[el]) {
    max = el;
    maxi = duplicates[el];
  }
});
console.log(max);

1

다음은 내장 된 맵을 사용하는 최신 버전입니다 (고유 한 문자열로 변환 할 수있는 것 이상에서 작동 함).

'use strict';

const histogram = iterable => {
    const result = new Map();

    for (const x of iterable) {
        result.set(x, (result.get(x) || 0) + 1);
    }

    return result;
};

const mostCommon = iterable => {
    let maxCount = 0;
    let maxKey;

    for (const [key, count] of histogram(iterable)) {
        if (count > maxCount) {
            maxCount = count;
            maxKey = key;
        }
    }

    return maxKey;
};

console.log(mostCommon(['pear', 'apple', 'orange', 'apple']));


0

두 가지 접근 방식이 있습니다. 둘 다 장점이 있습니다.

정렬 한 다음 Count 또는 Loop를 수행하고 해시 테이블을 사용하여 계산을 수행하십시오.

처리가 완료되면 모든 고유 요소가 있으므로 해시 테이블이 좋습니다. 하지만 수백만 개의 항목이있는 경우 중복 률이 낮 으면 해시 테이블이 많은 메모리를 사용하게 될 수 있습니다. 정렬 후 계산 방법은 훨씬 더 제어 가능한 메모리 공간을 갖습니다.


0
var array = [1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17],
    c = {}, // counters
    s = []; // sortable array

for (var i=0; i<array.length; i++) {
    c[array[i]] = c[array[i]] || 0; // initialize
    c[array[i]]++;
} // count occurrences

for (var key in c) {
    s.push([key, c[key]])
} // build sortable array from counters

s.sort(function(a, b) {return b[1]-a[1];});

var firstMode = s[0][0];
console.log(firstMode);

0

이것을 시도 할 수 있습니다.

 // using splice()   
 // get the element with the highest occurence in an array
    function mc(a) {
      var us = [], l;
      // find all the unique elements in the array
      a.forEach(function (v) {
        if (us.indexOf(v) === -1) {
          us.push(v);
        }
      });
      l = us.length;
      while (true) {
        for (var i = 0; i < l; i ++) {
          if (a.indexOf(us[i]) === -1) {
            continue;
          } else if (a.indexOf(us[i]) != -1 && a.length > 1) {
            // just delete it once at a time
            a.splice(a.indexOf(us[i]), 1);
          } else {
            // default to last one
            return a[0];
          }
        }
      }
    }

// using string.match method
function su(a) {
    var s = a.join(),
            uelms = [],
            r = {},
            l,
            i,
            m;

    a.forEach(function (v) {
        if (uelms.indexOf(v) === -1) {
            uelms.push(v);
        }
    });

    l = uelms.length;

    // use match to calculate occurance times
    for (i = 0; i < l; i ++) {
        r[uelms[i]] = s.match(new RegExp(uelms[i], 'g')).length;
    }

    m = uelms[0];
    for (var p in r) {
        if (r[p] > r[m]) {
            m = p;
        } else {
            continue;
        }
    }

    return m;
}

0

O (n) 복잡성으로 해결할 수 있습니다.

var arr = [1,3,54,56,6,6,1,6];
var obj = {};

/* first convert the array in to object with unique elements and number of times each element is repeated */
for(var i = 0; i < arr.length; i++)
{
   var x = arr[i];
   if(!obj[x])
     obj[x] = 1;
   else 
     obj[x]++;
}

console.log(obj);//just for reference

/* now traverse the object to get the element */
var index = 0;
var max = 0;

for(var obIndex in obj)
{
  if(obj[obIndex] > max)
  {
    max = obj[obIndex];
    index = obIndex;
  }
}
console.log(index+" got maximum time repeated, with "+ max +" times" );

위 코드를 실행하려면 크롬 콘솔에 복사하여 붙여 넣기 만하면됩니다.


0

이 함수는 모든 유형의 정보에 대한 일반 함수입니다. 요소의 발생을 계산 한 다음 최대 발생 요소가있는 배열을 반환합니다.

function mode () {
  var arr = [].slice.call(arguments);
  if ((args.length == 1) && (typeof args[0] === "object")) {
    args = args[0].mode();
  }

  var obj = {};
  for(var i = 0; i < arr.length; i++) {
    if(obj[arr[i]] === undefined) obj[arr[i]] = 1;
    else obj[arr[i]]++;
  }

  var max = 0;
  for (w in obj) {
    if (obj[w] > max) max = obj[w];
  }

  ret_val = [];
  for (w in obj) {
    if (obj[w] == max) ret_val.push(w);
  }

  return ret_val;
}

0
function mode(){
  var input = $("input").val().split(",");
  var mode = [];
  var m = [];
  var p = [];
    for(var x = 0;x< input.length;x++){
      if(m.indexOf(input[x])==-1){
        m[m.length]=input[x];
    }}
  for(var x = 0; x< m.length;x++){
    p[x]=0;
    for(var y = 0; y<input.length;y++){
      if(input[y]==m[x]){
      p[x]++; 
 }}}
 for(var x = 0;x< p.length;x++){
   if(p[x] ==(Math.max.apply(null, p))){
     mode.push(m[x]);
 }} 
$("#output").text(mode);}

0

여기 내 방식입니다. 데이터를 그룹화하려고합니다.

const _ = require("underscore")

var test  = [ 1, 1, 2, 1 ];
var groupResult = _.groupBy(test, (e)=> e);

groupResult는 다음과 같아야합니다.

{
  1: [1, 1, 1]
  2: [2] 
}

그런 다음 가장 긴 배열을 가진 속성을 찾으십시오.

function findMax(groupResult){
   var maxArr = []
   var max;
   for(var item in groupResult){
     if(!max) { 
        max = { value:item, count: groupResult[item].length } ; 
        maxArr.push(max); 
        continue;
     }
     if(max.count < groupResult[item].length){ 
        maxArr = [];
        max = { value:item, count: groupResult[item].length }
        maxArr.push(max)
     } else if(max === groupResult[item].length)
        maxArr.push({ value:item, count: groupResult[item].length })
   }
   return maxArr;
}

완전한 코드는 다음과 같습니다.

const _ = require("underscore")

var test  = [ 1, 1, 2, 1 ];
var groupResult= _.groupBy(test, (e)=> e);
console.log(findMax(groupResult)[0].value);

function findMax(groupResult){
   var maxArr = []
   var max;
   for(var item in groupResult){
     if(!max) { 
        max = { value:item, count: groupResult[item].length } ; 
        maxArr.push(max); 
        continue;
     }
     if(max.count < groupResult[item].length){ 
        maxArr = [];
        max = { value:item, count: groupResult[item].length }
        maxArr.push(max)
     } else if(max === groupResult[item].length)
        maxArr.push({ value:item, count: groupResult[item].length })
   }
   return maxArr;
}

0
var cats = ['Tom','Fluffy','Tom','Bella','Chloe','Tom','Chloe'];
var counts = {};
var compare = 0;
var mostFrequent;
(function(array){
   for(var i = 0, len = array.length; i < len; i++){
       var word = array[i];

       if(counts[word] === undefined){
           counts[word] = 1;
       }else{
           counts[word] = counts[word] + 1;
       }
       if(counts[word] > compare){
             compare = counts[word];
             mostFrequent = cats[i];
       }
    }
  return mostFrequent;
})(cats);

0

ES6를 사용하면 다음과 같이 메소드를 연결할 수 있습니다.

    function findMostFrequent(arr) {
      return arr
        .reduce((acc, cur, ind, arr) => {
          if (arr.indexOf(cur) === ind) {
            return [...acc, [cur, 1]];
          } else {
            acc[acc.indexOf(acc.find(e => e[0] === cur))] = [
              cur,
              acc[acc.indexOf(acc.find(e => e[0] === cur))][1] + 1
            ];
            return acc;
          }
        }, [])
        .sort((a, b) => b[1] - a[1])
        .filter((cur, ind, arr) => cur[1] === arr[0][1])
        .map(cur => cur[0]);
    }
    
    console.log(findMostFrequent(['pear', 'apple', 'orange', 'apple']));
    console.log(findMostFrequent(['pear', 'apple', 'orange', 'apple', 'pear']));

두 요소에 동일한 발생이 있으면 두 요소를 모두 반환합니다. 그리고 그것은 모든 유형의 요소와 함께 작동합니다.


arr해당 변수가 이미 매개 변수로 정의 된 범위 내 에서 변수를 사용해서는 안됩니다 . 이로 인해 사용되는 브라우저에 따라 버그가 발생할 수 있습니다.
mesqueeb

어느 arr로 불린다 arr.indexOf(cur)? 맨 위 매개 변수 또는 내부의 매개 변수가 감소합니까 ??
mesqueeb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.