javascript - 根据属性过滤和映射数组对象
问题描述
嗨,我有一个数组group
,我正在基于该数组为某种语言创建一个类别数组。我想生成相同的数组,但只使用过滤器和映射方法。
var group = [
{
nodes: [
{
frontmatter: {
category: 'someCategory DE',
},
fields: {
locale: 'de',
},
},
{
frontmatter: {
category: 'HTML&CSS DE',
},
fields: {
locale: 'de',
},
},
],
},
{
nodes: [
{
frontmatter: {
category: 'react',
},
fields: {
locale: 'en',
},
},
{
frontmatter: {
category: 'HTML&CSS',
},
fields: {
locale: 'en',
},
},
{
frontmatter: {
category: 'javascript',
},
fields: {
locale: 'en',
},
},
{
frontmatter: {
category: 'someCategory',
},
fields: {
locale: 'en',
},
},
{
frontmatter: {
category: 'HTML&CSS',
},
fields: {
locale: 'en',
},
},
{
frontmatter: {
category: 'react',
},
fields: {
locale: 'en',
},
},
],
},
]
我的工作代码没有使用过滤器和地图。
const locale = 'de'
const arr = []
group.forEach(el => {
el.nodes.forEach(e => {
if (e.fields.locale == locale) {
arr.push(e.frontmatter.category)
}
})
})
例如“en”语言的预期结果
arr = ["react", "HTML&CSS", "javascript", "someCategory", "HTML&CSS", "react"]
谢谢你
解决方案
这是一个非常紧凑的完全声明性方法,它返回与输入语言环境匹配的唯一类别列表。
const group = [{ nodes: [{ frontmatter: { category: 'someCategory' }, fields: { locale: 'de' } }, { frontmatter: { category: 'HTML&CSS' }, fields: { locale: 'de' } }] }, { nodes: [{ frontmatter: { category: 'react' }, fields: { locale: 'en' } }, { frontmatter: { category: 'HTML&CSS' }, fields: { locale: 'en' } }, { frontmatter: { category: 'javascript' }, fields: { locale: 'en' } }, { frontmatter: { category: 'someCategory' }, fields: { locale: 'en' } }, { frontmatter: { category: 'HTML&CSS' }, fields: { locale: 'en' } }, { frontmatter: { category: 'react' }, fields: { locale: 'en' } }] }];
// Function:
const getCategoriesByLocale = locale => [...new Set(
group
.flatMap(g => g.nodes.filter(n => n.fields.locale == locale))
.map(n => n.frontmatter.category)
)];
// Usage:
console.log(getCategoriesByLocale("en"));
console.log(getCategoriesByLocale("de"));
如果唯一性实际上不是您想要的,您可以删除Set
包装器以获得更短的功能:
const getCategoriesByLocale = locale =>
group
.flatMap(g => g.nodes.filter(n => n.fields.locale == locale))
.map(n => n.frontmatter.category);
推荐阅读
- javascript - 用户输入货币额外小数
- c++ - 如何在指向图像的指针上应用 cv::Rect?
- ios - 符合 X UITextView 属性的 X 代表?
- r - r mirt 错误在 UseMethod("itemfit") - 没有适用的方法
- angular - 有没有办法像这样设置 Angular Material Tabs 的样式?
- sycl - 使用 SYCL USM 时无法通过 malloc_device 分配内存
- java - JSF1064:找不到资源!只有当我在 Firefox 中使用我的项目时
- node.js - 使用 express 框架 js 将图像插入 SQL Server
- jquery - 使用ajax悬停和删除操作的最后一个唯一索引?
- pvlib - pvlib.inverter.fit_sandia 返回零 C1、C2、C3 系数