【问题标题】:Lodash create collection from duplicate object keysLodash 从重复的对象键创建集合
【发布时间】:2016-11-21 04:11:37
【问题描述】:

我有以下结构:

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"]
}]

非常感谢您一如既往的帮助。解释解决方案的工作原理是一个巨大的优势。

【问题讨论】:

  • titles 如果只有一条记录,应该是数组吗?
  • 房产真的是'title:'吗?
  • @NinaScholz.. 很好发现

标签: javascript arrays object lodash


【解决方案1】:

使用_.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();

【讨论】:

  • 您缺少 .value() 解析器来解析链,否则您将得到一个 LodashWrapper 而不是所需的值,+1 表示不错的方法
【解决方案2】:

更好的 lodash 版本可能是(使用很棒的 chaining 方法)

_(a).groupBy('article').map( (x,k) => ({ article: k, titles:_.map(x, 'title')}) ).value();  

如果你想按文章分组(所以文章是关键,有助于快速查找)

_(a).groupBy('article').mapValues(x => _.map(x, 'title')).value();

【讨论】:

  • 这不是同一个答案吗?您在解决方案中添加了箭头功能,但除此之外,您的答案只有第二部分是新的。
  • @4castle 实际上我没有检查你的,但你原来的答案有点不同,(我想你用过_.chain),即使现在你的也不正确,因为你错过了最后的 .value() 解析器
  • 它工作正常,但我也觉得只有在使用.chain() 时才需要.value()。这就是我切换到构造函数的原因。
【解决方案3】:

纯 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);

【讨论】:

  • 谢谢你,虽然一个 lodash 的例子会很棒。只是为了保持简短。
猜你喜欢
  • 2017-01-21
  • 2020-07-19
  • 2021-10-12
  • 2015-09-09
  • 2016-09-04
  • 2018-05-13
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多