Lodash создать коллекцию из дубликатов ключей объекта

У меня есть следующая структура:

var output = [{
    "article": "BlahBlah",
    "title": "Another blah"
}, {
    "article": "BlahBlah",
    "title": "Return of the blah"
}, {
    "article": "BlahBlah2",
    "title": "The blah strikes back"
}, {
    "article": "BlahBlah2",
    "title": "The blahfather"
}]

Исходя из вышеизложенного, используя элегантный однострочный lodash, мне нужно создать следующую структуру.

var newOutput = [{
    "article": "BlahBlah",
    "titles": ["Another blah", "Return of the blah"]
}, {
   "article": "BlahBlah2",
   "titles": ["The blah strikes back", "The blahfather"]
}]

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

 Tushar18 июл. 2016 г., 15:59
titles должен быть массив, если есть только одна запись?
 MindVox18 июл. 2016 г., 18:25
@NinaScholz .. хорошо заметили
 Nina Scholz18 июл. 2016 г., 17:03
собственность действительно'title:'?

Ответы на вопрос(2)

Решение Вопроса

использование_.groupBy а потом_.map результирующий объект в массив объектов.

var newOutput = _(output)
    .groupBy('article')
    .map(function(v, k){ return { article: k, titles: _.map(v, 'title') } })
    .value();

var output = [{"article":"BlahBlah","title":"Another blah"},{"article":"BlahBlah","title":"Return of the blah"},{"article":"BlahBlah2","title":"The blah strikes back"},{"article":"BlahBlah2","title":"The blahfather"}];

let newOutput = _(output)
    .groupBy('article')
    .map(function(v, k){ return { article: k, titles: _.map(v, 'title') } })
    .value();

console.log(newOutput);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

С помощью стрелок ES6,

var newOutput = _(output)
    .groupBy('article')
    .map((v, k) => ({ article: k, titles: _.map(v, 'title') }))
    .value();
 amd19 июл. 2016 г., 09:03
Вы пропустили.value() resolver для разрешения цепочки, в противном случае вы получите LodashWrapper вместо необходимого значения, +1 для хорошего подхода

Предложение в простом Javascript

Он использует IIFE (выражение немедленной вызванной функции) для использования закрытых переменных и для сбора возвращаемых значений в массиве.

Кроме того, он использует хеш-таблицу для ссылки на нужный элемент массива.

var output = [{ article: "BlahBlah", title: "Another blah" }, { article: "BlahBlah", title: "Return of the blah" }, { article: "BlahBlah2", title: "The blah strikes back" }, { article: "BlahBlah2", title: "The blahfather" }],
    newOutput = function (data) {
        var r = [];
        data.forEach(function (a) {
            if (!this[a.article]) {
                this[a.article] = { article: a.article, titles: [] };
                r.push(this[a.article]);
            }
            this[a.article].titles.push(a.title);
        }, Object.create(null));
        return r;
    }(output);
        
console.log(newOutput);

 MindVox18 июл. 2016 г., 18:27
Спасибо, хотя пример lodash был бы отличным. Просто чтобы быть кратким.

Ваш ответ на вопрос