javascript - 根据多个条件减少数组
问题描述
我的任务是根据最多以下三个条件减少对象数组:
- 根据用户语言从数组中返回一个对象,例如
ru_RU
. - 如果未提供用户语言,则根据应用程序默认语言返回对象,
en_EN
. - 如果未提供用户语言,并且数组没有与默认应用程序语言对应的对象,则返回数组中的第一个对象。
下面是一个数组示例:
[
{
"id":1,
"language":{
"id":1,
"isoCode":"en_GB"
}
},
{
"id":2,
"language":{
"id":2,
"isoCode":"es_ES"
}
},
{
"id":3,
"language":{
"id":3,
"isoCode":"ru_RU"
}
},
{
"id":4,
"language":{
"id":4,
"isoCode":"fr_FR"
}
}
]
这是一个有效的解决方案:
const [userLanguageMessage] = data.filter(
(message) => message.language.isoCode === USER_LANGUAGE,
);
const [defaultLanguageMessage] = data?.filter(
(message) => message.language.isoCode === DEFAULT_LANGUAGE,
);
const [firstLanguageMessage] = data;
const message = userLanguageMessage || defaultLanguageMessage || firstLanguageMessage;
我想让它更整洁,可以这么说,想知道我是否可以使用 reduce 来实现它。
解决方案
有了这个给定的结构,这样的东西应该可以工作
result =
data.find(x => x.language.isoCode === userLanguage) ||
data.find(x => x.language.isoCode === 'en_US') ||
data[0]
或更有效的方式:
function get(data, lang) {
let def = null;
for (let x of data) {
if (x.language.isoCode === lang)
return x;
if (x.language.isoCode === 'en_US')
def = x;
}
return def || data[0]
}
但你应该真的Map
为此使用查找。
作为旁注,我一直想知道有什么特别之处reduce
以至于人们觉得有必要使用它。
推荐阅读
- android - Kotlin - PagaingDataAdapter;删除位置的项目
- flutter - 添加对 firebase flutter web 项目的重写以将所有调用定向到云函数
- ssh - 通过两台远程机器的 ssh 进行 pip 安装
- flutter - 我可以发布我的颤振应用程序并在生产中启用飞镖空安全功能吗
- https - Icecast、Ices2 和 HTTPS
- python - z 轴的非线性颜色范围
- postgresql - 从 Oracle SQL 转换 Postgres
- c# - 异步方法运行速度太快,无法在主线程上更新我的列表框
- node.js - 赛普拉斯永远不会通过 Windows 上的加载屏幕
- sql - Redshift 中的每月计数行 - 如何在没有活动的月份的结果中包含 0 行