Как найти наиболее часто встречающийся элемент в массиве, ничего не изменяя? - PullRequest
0 голосов
/ 05 мая 2018

Я хотел бы знать, как я могу реорганизовать этот код в неизменяемую реализацию в чистом javascript без использования immutable.js.

var arr1=[3, 'oo', 'oo', 'oo', 2, 3, 'oo', 3, 'oo', 2, 4, 9, 3];
var mf = 1;
var m = 0;
var item;
for (var i=0; i<arr1.length; i++)
{
    for (var j=i; j<arr1.length; j++)
    {
            if (arr1[i] == arr1[j])
             m++;
            if (mf<m)
            {
              mf=m; 
              item = arr1[i];
            }
    }
    m=0;
}
console.log(item+" ( " +mf +" times ) ");

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Используя Map() и .reduce(), вы можете создать очень функциональный подход:

const array = [3, 'oo', 'oo', 'oo', 2, 3, 'oo', 3, 'oo', 2, 4, 9, 3]

const maxOccurences = array => Array.from(
  array.reduce(
    (map, value) => map.set(
      value,
      map.has(value)
        ? map.get(value) + 1
        : 1
    ),
    new Map()
  ).entries()
).reduce(
  (max, entry) => entry[1] > max[1] ? entry : max
).reduce(
  (item, count) => ({ item, count })
)

console.log(maxOccurences(array))

И не то, чтобы я когда-либо рекомендовал делать это в рабочем коде, но вы можете изменить Array.prototype, чтобы расширить эту функциональность в качестве метода-члена массивов для удобства:

const array = [3, 'oo', 'oo', 'oo', 2, 3, 'oo', 3, 'oo', 2, 4, 9, 3]

Object.defineProperty(Array.prototype, 'max', {
  value () {
    return Array.from(
      this.reduce(
        (map, value) => map.set(
          value,
          map.has(value)
            ? map.get(value) + 1
            : 1
        ),
        new Map()
      ).entries()
    ).reduce(
      (max, entry) => entry[1] > max[1] ? entry : max
    ).reduce(
      (item, count) => ({ item, count })
    )
  },
  configurable: true,
  writable: true
})

console.log(array.max())
0 голосов
/ 05 мая 2018

Похоже, вы пытаетесь найти наиболее часто встречающийся элемент в массиве. Подсчитайте количество повторений каждого элемента с помощью reduce и найдите максимальное количество повторений.

При уменьшении обязательно возвращайте новый объект для аккумулятора каждый раз, чтобы не изменять его.

const arr1 = [3, 'oo', 'oo', 'oo', 2, 3, 'oo', 3, 'oo', 2, 4, 9, 3];
const reps = arr1.reduce((accum, item) => {
  const newCount = (accum[item] || 0) + 1;
  return { ...accum, [item]: newCount };
}, {});
const maxTimes = Math.max.apply(null, Object.values(reps));
const [recordItem] = Object.entries(reps).find(([, val]) => val === maxTimes);

console.log(recordItem + " ( " + maxTimes +" times ) ");

Если вам нужно идентифицировать все элементы, соответствующие записи, используйте filter вместо find:

const arr1 = [3, 'oo', 'oo', 'oo', 2, 3, 'oo', 3, 'oo', 2, 4, 9, 3, 3];
const reps = arr1.reduce((accum, item) => {
  const newCount = (accum[item] || 0) + 1;
  return { ...accum, [item]: newCount };
}, {});
const maxTimes = Math.max.apply(null, Object.values(reps));
const recordItems = Object.entries(reps)
  .filter(([, val]) => val === maxTimes)
  .map(([key, val]) => key);

console.log(recordItems.join(', ') + " ( " + maxTimes +" times ) ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...