Подтвердить что ты не робот

Underscore.js находит уникальные значения в массиве объектов; Возвращайте уникальные предметы и их количество

Я использую _underscore.js для поиска всех уникальных элементов в массиве, но я не могу понять, как получить также количество уникальных элементов.

_PERSONARRAY = [{name:"tom",age:7}{name:"john",age:9}{name:"becky",age:2}{name:"sam",age:7}]

_UNIQUEAGEARRAY = _.chain(_PERSONARRAY).map(function(person) { return person.age }).uniq().value();

В этом случае _UNIQUEAGEARRAY будет равно:

[7,9,2]

Мне действительно нужно вернуть что-то вроде:

[{uniqueAge:7,numberOfPeople:2}{uniqueAge:9,numberOfPeople:1}{uniqueAge:2,numberOfPeople:1}]

Спасибо за помощь. Кроме того, я предполагаю, что _underscore.js быстро это делает? Если это глупо, скажите мне, потому что я буду открыт для других решений.

4b9b3361

Ответ 1

Я думаю, что вы ищете функцию countBy:

_UNIQUEAGEARRAY = _.countBy(_PERSONARRAY, "age");

Получает результат:

{"2":1,"7":2,"9":1}

JSFiddle demo: http://jsfiddle.net/4J2SX/

Ответ 2

Хорошим решением является использование необязательной функции итератора для подчеркивания функции uniq:

let people = [
  {name: "Alice", age: 21}, 
  {name: "Bob", age: 34},
  {name: "Caroline", age: 21}
];
_.uniq(people, person => person.age);

Документы: http://underscorejs.org/#uniq

Ответ 3

Вы можете использовать underscore groupBy, если хотите (может быть, не очень хорошая идея для большого набора данных, поскольку он хранит список всех сгруппированных элементов)

Пример:

var d = _.groupBy(_PERSONARRAY, function(p){ 
    return p.age;
});

Если вы хотите сопоставить это с вашим точным форматом, попробуйте сделать карту после groupBy:

var x = _.map(d, function(people, age) {   
    return {uniqueAge: age,  numberOfPeople: people.length};   
});

jsFiddle: http://jsfiddle.net/jsgkC/2/

Ответ 4

Функция

groupBy полезна.

_personsList = [{name:"anjo",age:5},{name:"george",age:3},{name:"jack",age:5}];
_uniqAgeList = _.groupBy(_personsList, "age");

будет выдавать выходные данные

{
    "3":[{"name":"george","age":3}],
    "5":[{"name":"anjo","age":5},{"name":"jack","age":5}]
}

jsfiddle: http://jsfiddle.net/4J2SX/199/