如何在ES6中编写嵌套循环?如何将指定嵌套循环改写为ES6单行代码?
嘿,我来帮你解决这两个ES6相关的问题!
一、ES6中的嵌套循环写法
ES6里实现嵌套循环有几种常用方式,你可以根据场景灵活选择:
forEach嵌套:这是最直观的写法,和你原代码里的用法一致,利用数组内置的forEach方法遍历元素,嵌套回调函数实现多层循环。示例:
const nums = [1, 2, 3]; const chars = ['x', 'y']; nums.forEach(num => { chars.forEach(char => { console.log(`${num} 搭配 ${char}`); }); });
for...of循环:ES6新增的迭代语法,可读性更好,而且支持break/continue来中断循环(这是forEach做不到的)。如果需要在循环中做条件中断,这个方案更合适:
for (const num of nums) { for (const char of chars) { console.log(`${num} 搭配 ${char}`); if (char === 'y') break; // 直接终止内层循环 } }
- 高阶函数组合(声明式写法):如果是做数据处理(比如你第二个问题里的筛选匹配),更推荐用
filter、some这类高阶函数替代命令式的嵌套循环,代码更简洁且语义化。比如你原需求里的匹配逻辑,完全可以用filter+map来实现,不需要手动嵌套循环。
二、将给定代码改写为ES6单行代码
先拆解原代码的逻辑:从fruits数组里筛选出id存在于selectedFruits(注意这里selectedFruits的元素是字符串,而fruit.id是数字)的项,然后收集它们的name。
这里用filter+map的链式调用就能写成简洁的单行代码:
const fruitsArr = fruits.filter(fruit => selectedFruits.includes(String(fruit.id))).map(fruit => fruit.name);
如果想优化性能(避免每次filter都把fruit.id转成字符串),可以先把selectedFruits转成数字数组再匹配,同样可以写成单行:
const fruitsArr = fruits.filter(fruit => selectedFruits.map(Number).includes(fruit.id)).map(fruit => fruit.name);
或者用reduce一步完成筛选和收集,也是单行实现:
const fruitsArr = fruits.reduce((acc, fruit) => selectedFruits.includes(String(fruit.id)) ? [...acc, fruit.name] : acc, []);
测试这几种写法,输出结果和你原代码完全一致:["apple"]。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

