javascript - javascript中的功能不可变方式根据项目的条件在某些位置复制带有附加项目的数组
问题描述
我有一个数组:
[
{ "name": "batman", "hasSidekick": true },
{ "name": "shazam!", "hasSidekick": false },
{ "name": "capt america", "hasSidekick": true },
{ "name": "spiderman", "hasSidekick": false }
]
由此,我想创建一个新的英雄名称数组,其中包含上述所有名称,但是当hasSidekick
英雄为真时,应该在其后插入一个额外的名称。
预期输出:
[
"batman",
"batman's sidekick",
"shazam!", ,
"capt america",
"capt america's sidekick",
"spiderman"
]
我可以forEach
根据以下条件有条件地推送其他项目hasSidekick
:
const heroes = [
{ name: "batman", hasSidekick: true },
{ name: "shazam!", hasSidekick: false },
{ name: "capt america", hasSidekick: true },
{ name: "spiderman", hasSidekick: false },
];
let heroesAndSidekicks = [];
heroes.forEach(hero => {
heroesAndSidekicks.push(hero.name);
if (hero.hasSidekick) {
heroesAndSidekicks.push(`${hero.name}'s sidekick`);
}
});
console.log(heroesAndSidekicks);
但请建议我如何以函数式编程方式做到这一点而不会发生突变。
解决方案
你可以拿Array#flatMap
。
var data = [{ name: "batman", hasSidekick: true }, { name: "shazam!", hasSidekick: false }, { name: "capt america", hasSidekick: true }, { name: "spiderman", hasSidekick: false }],
result = data.flatMap(({ name, hasSidekick }) => hasSidekick
? [name, name + '\'s sidekick']
: name
);
console.log(result);
推荐阅读
- javascript - react: array "contains" method
- coq - Coq 库的开发。(添加 LoadPath 解决方案不够好。)
- android - grafika 在后台使用 camera2 连续编码视频
- javascript - 如何从 TinyMce 编辑器中删除第一个 nbsp?
- maven - selenium-chrome-driver 依赖项有什么用,没有 chrome 二进制文件?
- ruby-on-rails - Ruby on Rails 中的 `==` 方法与 `has_and_belongs_to_many`
- gcc - 如何使用 arm-none-eabi-gcc 工具链在固件映像中保留未使用的功能?
- android - 自定义警报对话框宽度大于布局 xml 中显示的宽度
- java - 如何让spring boot配置模块独立于spring boot版本?
- java - 如何调用 maven-resources-plugin 然后 exec-maven-plugin 然后再调用 maven-resources-plugin