javascript - 根据属性合并两个数组

标签 javascript lodash

我有两个数组:一个包含类别,第二个包含项目。

我想使用 lodash 将所有项目合并到正确的类别数组中。不过,我确实有一个问题。既然这可以通过双 foreach 循环来完成,那么有什么理由使用 lodash 吗?

数组 1(类别):

"categories": [
    {
        "id": 1,
        "name": "cat_1",
        "items": []
    },
    {
        "id": 11,
        "name": "cat_2",
        "items": []
    },
    {
        "id": 61,
        "name": "cat_3",
        "items": []
    }
]

数组 2(包含项目):

[ 
    { 
        id: 15,
        name: 'some_item',
        category_id: 1,
        category_name: 'cat_1',
    },
    { 
        id: 112,
        name: 'some_item',
        category_id: 11,
        category_name: 'cat_2',
    },
    { 
        id: 235,
        name: 'some_item',
        category_id: 11,
        category_name: 'cat_2',
    },

]

所需的对象看起来是:

"categories": 
    [
        {
            "id": 1,
            "name": "cat_1",
            "items": [
                { 
                    id: 15,
                    name: 'some_item',
                    category_id: 1,
                    category_name: 'cat_1',
                }
            ]
        },
        {
            "id": 11,
            "name": "cat_2",
            "items": [
                { 
                    id: 112,
                    name: 'some_item',
                    category_id: 11,
                    category_name: 'cat_2',
                },
                { 
                    id: 235,
                    name: 'some_item',
                    category_id: 11,
                    category_name: 'cat_2',
                }
            ]
        },
        {
            "id": 61,
            "name": "cat_3",
            "items": []
        }
    ]

最佳答案

这就是使用普通 ES5 的方式:

const categories = [{id:1,name:"cat_1",items:[]},{id:11,name:"cat_2",items:[]},{id:61,name:"cat_3",items:[]}]
const items = [{id:15,name:"some_item",category_id:1,category_name:"cat_1"},{id:112,name:"some_item",category_id:11,category_name:"cat_2"},{id:235,name:"some_item",category_id:11,category_name:"cat_2"}];

const result =
  categories.map(c => ({ ...c, items: items.filter(i => i.category_id === c.id) }));
  
console.log(result);

Javascript 是一种非常特殊的语言,因为它的历史。它最初是一种非常简陋的语言,几乎没有什么功能,尽管它已经发展,但并非所有浏览器都支持它的所有功能。

这导致了 lodash、underscore、inmutable.js 和 jquery 等库的出现,它们填补了 Javascript 标准库的空白。

正如你所见,现在 JS 有了非常方便的抽象,例如 eachmapfindfilterreduce,这是跨语言的普遍理解的概念。这使得代码比使用 for 循环编写低级过程代码更容易理解。

作为一个颜色注释,我开始使用 ruby​​ 进行编程,它以 standard library rich in collection abstractions 而闻名。 。因此,直到最近我才注意到语言中的 for 循环,即使它们是实现更高级别抽象所必需的。

关于javascript - 根据属性合并两个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46834489/

相关文章:

javascript - 如何设置彼此相邻的图像列表

javascript - JQuery 事件应该更改 iframe 的 src

javascript - 为什么 jQuery.extend() 比 Lodash .clone() 更快

javascript - Lodash - 使用 N(重复)键作为父项对子项进行分组

javascript - 如何预先计算在 waitForKeyElements() 回调中使用的内容?

javascript - SVG 滤镜不会在悬停时消失

javascript - getElementsByTagName 其中属性 == 值?

javascript - 获取对象中最后一个最深级别的项目

javascript - 如何正确使用lodash pick方法

javascript - 如何使用 Webpack 2 从 Marionette 3 应用程序中排除 lodash 的未使用部分