Javascript 使用.map转换嵌套For循环

Javascript 使用.map转换嵌套For循环,javascript,for-loop,ecmascript-6,functional-programming,Javascript,For Loop,Ecmascript 6,Functional Programming,我正在尝试使用.map()转换嵌套for循环,以使其更具功能性。 我的目标是创建一个简单的卡片组。这是我的工作代码: generateDeck() { const card = (suit, value) => { return suit + value; } const suits = ["S", "H", "D", "C"]; const values = [&

我正在尝试使用.map()转换嵌套for循环,以使其更具功能性。 我的目标是创建一个简单的卡片组。这是我的工作代码:

 generateDeck() {
    const card = (suit, value) => {
      return suit + value;
    }
    const suits = ["S", "H", "D", "C"];
    const values = ["7", "8", "9", "10", "J", "D", "K", "A"];

    for (let s = 0; s < suits.length; s++) {
      for (let v = 0; v < values.length; v++) {
        this.deck.push(card(suits[s], values[v]))
      }
    }
  }
我不能让它工作。如何以更干净、更实用的方式避免嵌套for循环


谢谢

你是对的,你可以使用
map
使它更“实用”。Map返回一个新数组,而forEach仅循环遍历项。也可以省略花括号直接返回值

 generateDeck() {
    const card = (suit, value) => suit + value;
    const suits = ["S", "H", "D", "C"];
    const values = ["7", "8", "9", "10", "J", "D", "K", "A"];

    let deckNew = suits.map(s => values.map(v => s + v));
    return deckNew;
 }

可以嵌套贴图,这将生成二维数组。然后使用
flatMap
可以将其转换为简单数组

flatMap展平多维数组。e、 g:

[[1,2], [3,4]].flatMap(x => x)
将给出[1,2,3,4]

所以像这样的事情(我没有测试)


您不能使用
map
,因为您必须组合两个数组。但是您也不应该使用
flatmap
,因为没有值的依赖关系。您需要的是一个应用函子:

const arrAp=tf=>xs=>
arrFold(acc=>f=>
arrAppend(acc)
(arrMap(x=>f(x))(xs)))
([])
(tf);
常量arrMap=f=>xs=>
x.map((x,i)=>f(x,i));
常量liftA2=({map,ap})=>f=>tx=>ty=>
ap(map(f)(tx))(ty);
常量arrLiftA2=liftA2({map:arrMap,ap:arrAp});
常量arrFold=f=>init=>xs=>{
设acc=init;
for(设i=0;iys=>
xs.concat(ys);
//库代码^^^
常量值=[“7”、“8”、“9”、“10”、“J”、“D”、“K”、“A”];
常数=[“S”、“H”、“D”、“C”];
const createDeck=values=>suites=>[values,suites];
console.log(

arrLiftA2(createDeck)(价值)(诉讼)我认为你应该使用reduce

const-card=(套装)=>(价值)=>套装+价值;
常数=['S','H','D','C'];
常量值=['7','8','9','10','J','D','K','A'];
常数甲板=西服。减少((上,西服)=>{
const suitedCard=卡片(套装);
返回[…上一个,…值.map(suitedCard)];
}, []);

控制台。原木(甲板)因此,从函数式编程的角度来看,我认为一个好的方法是尽可能地声明性。您实际上不需要修改这个算法,因为输出“通过从列表中创建每个可能的对而提供的两个列表中的一个新列表”是一个非常常见的操作,已经存在很多实现

  • 比如说
const suits=[”♠︎", "♣︎", "♥︎", "♦︎"];
常量值=[“7”、“8”、“9”、“10”、“J”、“D”、“K”、“A”];
const createDeck=R.pipe(
R.xprod,
R.map(R.join(“”)),
);
console.log(
createDeck(套装、价值观),
);

在一个for-each中返回东西没有任何作用,您可能希望两者都成为一个
映射
[[1,2], [3,4]].flatMap(x => x)
generateDeck() {
  const card = (suit, value) => {
    return suit + value;
  }
  const suits = ["S", "H", "D", "C"];
  const values = ["7", "8", "9", "10", "J", "D", "K", "A"];
  return suits.flatMap(
    suit => values.map(value => card(suit, value))
  );
}