Используя функцию lodash _.countBy, я создал объект tally, подсчитывающий, сколько раз значение встречается в массиве.
Как лучше всего выбрать наименьшее количество в объекте «значение -> количество»?
var/input = ["A","A","B","B","C"];
var/tally = _.countBy(input); // Tally is {"A":2, "B":2, "C":1}
// [...solution...]
Console.assert(lowest == "C");
Никакой специальной обработки ничьей не требуется, при условии, что она имеет наименьшее количество очков. Лодаш доступен.
Я действительно думаю, что вопрос требует некоторой доработки, но я отозвал свой закрытый голос после того, как внимательно прочитал его
В вопросе написано lodash, а на бирке написано underscore.js. Что вы на самом деле используете? Я знаю, что они похожи, но не идентичны, поэтому вам следует правильно пометить теги.
Я думал, что они такие же, а underscore.js - старое название для lodash. Я исправил теги.
Мне нужен элемент, который меньше всего встречается во входном массиве. Я использовал _.countBy, чтобы помочь в этом, но могут быть способы сделать это без использования _.countBy. Они могли бы быть лучше, я не знаю.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете уменьшить массив ключей и получить наименьший ключ, проверив значение.
var tally = { A: 2, B: 2, C: 1 },
lowest = Object.keys(tally).reduce((a, b) => tally[a] < tally[b] ? a : b);
console.info(lowest);Подход lodash путем объединения свойств и получения минимума с индексом 1 и взятия первого элемента массива.
var input = ["A", "A", "B", "B", "C"],
lowest = _(input)
.countBy() // { A: 2, B: 2, C: 1 }
.toPairs() // [["A", 2], ["B", 2], ["C", 1]]
.minBy(1) // ["C", 1]
[0];
console.info(lowest);<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>это намного чище
Этого можно добиться следующим образом:
var tally = {"A":2, "B":2, "C":1};
var tallyItemSmallestKey = Object
.entries(tally)
.sort((entry0, entry1) => entry0[1] - entry1[1] < 0 ? -1 : 1)
.map(entry => entry[0])[0];
console.info( tallyItemSmallestKey );Это можно было бы сократить до решения, отличного от _, если отсортировать входной массив:
const input = ["A","A","B","B","C"].sort();
let curr = { count: 0 }, result = { count: 0 };
for(const value of input) {
if (value === curr.value) curr.count++;
else curr = { value, count: 1 };
if (curr.count > result.count) result = curr;
}
console.info(result.value);
Вы можете получить подсчеты, а затем проверить минимальную
const input = ["A", "A", "B", "B", "C"]
// get counts
const tally = input.reduce((obj, char) => {
if (!obj[char])
obj[char]=1
else
obj[char]++
return obj
}, {})
// get min
let char = Reflect.ownKeys(tally).reduce((keep,current)=>{
if (!keep) keep = current
if (tally[current] < tally[keep])
keep = current
return keep
}, '')
console.info(char)
console.info(`'${char}' == 'A'`,char == 'A')
console.info(`'${char}' == 'C'`,char == 'C')С lodash вы можете использовать countBy, entries и minBy примерно так:
const input = ["A", "A", "B", "B", "C"]
const result = _.minBy(_.entries(_.countBy(input)), 1)
console.info(_.head(result)) // or just result[0]<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>Или через цепочку lodash:
const input = ["A", "A", "B", "B", "C"]
const result = _(input).countBy().entries().minBy(1)
console.info(_.head(result)) // or just result[0]<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>Вы также можете сделать это с ES6 с Array.reduce, Array.sort и Object.entries:
const input = ["A", "A", "B", "B", "C"]
const countBy = arr => arr.reduce((r,c) => (r[c] = (r[c] || 0) + 1, r), {})
const min = arr => arr.sort((a,b) => a[1] - b[1])[0] // sort asc and take first
console.info(min(Object.entries(countBy(input)))[0])Если вы не хотите импортировать все, что предлагает lodash, вы не можете использовать цепочку. Это версия Ответ Нины на основе _.flow():
const { flow, countBy, entries, partialRight, minBy, last, head } = _;
const input = ["A", "A", "B", "B", "C"];
const getByLowestCount = flow([
countBy,
entries,
partialRight(minBy, last),
head
]);
const result = getByLowestCount(input);
console.info(result);<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
Это можно перефразировать, дайте мне секунду