Страницы

Поиск по вопросам

понедельник, 18 февраля 2019 г.

Как найти значение которое повторяется чаще всего?

Допустим есть такой JSON:
[{"title":"a","cost":"56"},{"title":"b","cost":"34"},{"title":"a","cost":"233"},{"title":"c","cost":"3434"},{"title":"a","cost":"434"}]
Как найти title, который повторяется чаще всего ? Вот мой вариант, но хотелось бы увидеть более правильное решение
let arr = JSON.parse('[{"title":"a","cost":"56"},{"title":"b","cost":"34"},{"title":"a","cost":"233"},{"title":"c","cost":"3434"},{"title":"a","cost":"434"}]'); let names = []; for (let i = 0; i < arr.length; i++) { names.push(arr[i].title); } let counts = {}; let res = 0; names.forEach(function(x) { counts[x] = (counts[x] || 0) + 1; if (counts[x] > res) { res += counts[x]; } }); let max = 0; let maxName = ''; for (let key in counts) { if (max < counts[key]) { max = counts[key]; maxName = key; } } console.log(maxName); // a


Ответ

Нет смысла делать массив из заголовков - достаточно уже имеющегося. Для словаря вместо пустого объекта лучше использовать Object.create(null), чтобы не было проблем с методами в прототипе объекта. Ещё, если результат не превосходит 231, можно использовать ~~ для приведения к инту - в большинстве случаев помогает от той же проблемы при использовании {} (от всего кроме __proto__). Самых частых может быть несколько. Здесь баг: res += counts[x]; - должно быть просто =, а не +=. Хотя это значение дальше вообще почему-то не используется - непонятно, зачем тогда оно считалось. max < counts[key] - здесь могло бы быть counts[key] === res, если бы в прошлом пункте было написано верно.

Я бы сделал так если нужен массив:
var arr = JSON.parse('[{"title":"a","cost":"56"},{"title":"b","cost":"34"},{"title":"a","cost":"233"},{"title":"c","cost":"3434"},{"title":"a","cost":"434"}]'); var count = Object.create(null), max = 0, cur; for (var x of arr) { if ((cur = count[x.title] = ~~count[x.title] + 1) > max) { max = cur; } } var res = Object.keys(count).filter(x => count[x] === max); console.log(res);
и так, если нужен любой максимум:
var arr = JSON.parse('[{"title":"a","cost":"56"},{"title":"b","cost":"34"},{"title":"a","cost":"233"},{"title":"c","cost":"3434"},{"title":"a","cost":"434"}]'); var count = Object.create(null), max = 0, cur, res; for (var x of arr) { if ((cur = count[x.title] = ~~count[x.title] + 1) > max) { max = cur; res = x.title; } } console.log(res);

Комментариев нет:

Отправить комментарий