簡體   English   中英

如何對嵌套數組中的每個項目使用lodash分組

[英]How to groupby in lodash for each item in a nested array

我有一個形式的json數組:

    [{
        "published": true,
        "tags": ["tag1", "tag2"],
        "categories": ["cat1"],
        "author": "some name",
        "post-format": "standard",
        "title": "Second Post,",
        "url-slug": "second-post",
        "first-published-on": "2019-03-28",
        "last-updated-on": "2019-03-28",
        "meta": {
            "title": "Second Post",
            "description": "Second post."
        },
        "excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt",
        "path": "2019/03/28/SecondPost.md"
    }, {
        "published": true,
        "tags": ["tag1", "tag2", "tag3"],
        "categories": ["cat1", "cat2"],
        "author": "some name",
        "post-format": "standard",
        "title": "Getting Started",
        "url-slug": "getting-started",
        "first-published-on": "2019-03-20",
        "last-updated-on": "2019-03-20",
        "meta": {
            "title": "Getting Started",
            "description": "Getting started post."
        },
        "excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt",
        "path": "2019/03/20/GettingStarted.md"
    }]

我想按標簽將它們分組,格式如下:

[{
   "tag1": [{...}, {...}], 
   "tag2": [{...}, {...}], 
   "tag3": [{...}]
}]

我嘗試使用lodash這樣做:

const groupedByTag = _.groupBy(blogMetadata, function(postmetadata) {
        postmetadata.tags.map(tag => {
          return tag
        })
      })

顯然,以上代碼不正確,無法正常工作。 我看了一篇相關文章 ,但進展不大。 任何幫助表示贊賞。

您可以使用reduceforEach

這里的主意是

  • 首先,我們遍歷obj變量的每個元素。
  • 對於每個元素,我們遍歷tags屬性。
  • 我們檢查op已經具有該標簽,然后我們推入該值,否則我們向具有相應值的op對象添加一個新鍵

 let obj = [{"published": true,"tags": ["tag1", "tag2"],"categories": ["cat1"],"author": "some name","post-format": "standard","title": "Second Post,","url-slug": "second-post","first-published-on": "2019-03-28","last-updated-on": "2019-03-28","meta": {"title": "Second Post","description": "Second post."},"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt","path": "2019/03/28/SecondPost.md"}, {"published": true,"tags": ["tag1", "tag2", "tag3"],"categories": ["cat1", "cat2"],"author": "some name","post-format": "standard","title": "Getting Started","url-slug": "getting-started","first-published-on": "2019-03-20","last-updated-on": "2019-03-20","meta": {"title": "Getting Started","description": "Getting started post."},"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt","path": "2019/03/20/GettingStarted.md"}] let final = obj.reduce((op,inp) => { inp.tags.forEach(e => { op[e] = op[e] || [] op[e].push(JSON.parse(JSON.stringify(inp))) }) return op },{}) console.log(final) 

您可以使用reduceforEach替代loadash 在reduce回調函數中,對tags進行迭代,並檢查累加器對象是否存在該名稱的key 如果存在,則推送當前對象,否則創建一個key並推送value

 let data = [{ "published": true, "tags": ["tag1", "tag2"], "categories": ["cat1"], "author": "some name", "post-format": "standard", "title": "Second Post,", "url-slug": "second-post", "first-published-on": "2019-03-28", "last-updated-on": "2019-03-28", "meta": { "title": "Second Post", "description": "Second post." }, "excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", "path": "2019/03/28/SecondPost.md" }, { "published": true, "tags": ["tag1", "tag2", "tag3"], "categories": ["cat1", "cat2"], "author": "some name", "post-format": "standard", "title": "Getting Started", "url-slug": "getting-started", "first-published-on": "2019-03-20", "last-updated-on": "2019-03-20", "meta": { "title": "Getting Started", "description": "Getting started post." }, "excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", "path": "2019/03/20/GettingStarted.md" }]; let newMapped = [data.reduce(function(acc, curr) { curr.tags.forEach(function(item) { if (acc[item]) { acc[item].push(curr) } else { acc[item] = [curr] } }) return acc; }, {})]; console.log(newMapped) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM