Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For循环、map和forEach Javascript_Javascript_Arrays - Fatal编程技术网

For循环、map和forEach Javascript

For循环、map和forEach Javascript,javascript,arrays,Javascript,Arrays,我正在尝试创建一副52张卡片。我可以用double for循环轻松创建它,但它有O(n2)复杂性。所以我试着使用map()和forEach()数组方法,但它们需要返回内容,这很复杂。下面是我的代码 (函数deckCreate(){ var值=[1,2,3,4,5,6,7,8,9,10,11,12,13]; var套装=[“梅花”、“钻石”、“红心”、“黑桃”]; var newDeck=values.map(函数(xValue){ suits.forEach(函数(xSuit){ 返回[xSu

我正在尝试创建一副52张卡片。我可以用double for循环轻松创建它,但它有O(n2)复杂性。所以我试着使用map()和forEach()数组方法,但它们需要返回内容,这很复杂。下面是我的代码

(函数deckCreate(){
var值=[1,2,3,4,5,6,7,8,9,10,11,12,13];
var套装=[“梅花”、“钻石”、“红心”、“黑桃”];
var newDeck=values.map(函数(xValue){
suits.forEach(函数(xSuit){
返回[xSuit,xValue];
});
});
返回新甲板;

}());
您没有从
映射
函数返回任何内容,因此隐式返回值为
未定义
,因此您的13个
未定义
值的数组

suites.forEach
需要是
return suites.map
。这将为您提供一个包含13个元素的数组,其中每个元素都是一个包含四个元素的数组,其中内部数组的每个元素都是一个包含两个元素的数组。然后,您可以
将顶级数组缩减为您要查找的52个元素数组:

var newDeck = values.map(function(xValue) {
  return suits.map(function(xSuit) {
    return [xSuit,xValue];
  });
}).reduce(function (a, b) { return a.concat(b) });

出现问题的原因是您没有从外部
.map()
回调返回。即使您这样做了,
[].forEach
始终返回
未定义的
,而不管其回调中发生了什么

因此,由于您使用
forEach
来迭代内部数组,因此从
map
中可以得到13个未定义的数组

您应该一直使用
.map()
,并返回过程中的每一步:

const first=[1,2,3];
常数秒=['a','b','c'];
常量映射=第一个.map(函数(数字){
返回第二个.map(函数(字母){
返回[数字、字母];
});
});

console.log(映射)我认为最好简化它

我们知道只有4套西服,所以按西服名称列出就足够了:

函数createDeck(){
var值=[1,2,3,4,5,6,7,8,9,10,11,12,13];
var deck={“clubs”:values.slice(),“diamonds”:values.slice(),“hearts”:values.slice(),“spades”:values.slice();
返回甲板;
}
var deck=createDeck();
控制台日志('CLUBS:',deck.CLUBS);
console.log('DIAMONDS:',deck.DIAMONDS);
console.log('HEARTS:',deck.HEARTS);

控制台.log('SPADES:',甲板.SPADES)使用一个简单的
循环。使用
西服[Math.floor(i/13)]
获得合适的西服,并使用
%
获得每件西服的卡号:

函数deckCreate(){
var值=[1,2,3,4,5,6,7,8,9,10,11,12,13];
var套装=[“梅花”、“钻石”、“红心”、“黑桃”];
var newDeck=[];
对于(变量i=0;i<52;i++){
newDeck.push([suits[Math.floor(i/13)],值[i%13]);
}
返回新甲板;
}
var result=deckCreate();

控制台日志(结果)如何在生活之外访问
newDeck
?哦,我明白,第二节,modifying@guest271314现在检查(;“
return[xSuit,xValue]
”问题中给定的模式应该在
.map()
调用中第一个
和第二个
反转。Madara Uchiha感谢senpai的回答。我将检查reduce()方法now调用
.reduce()
的目的是什么?@guest271314正如我所说:
map(map(…)
的结果是一个嵌套的
13(4(2))数组
elements。问题是如何生成由西装/号码对组成的52个元素数组。Reduce将13*4个数组连接成一个52个元素的数组。您还可以将顶级数组传递给
array.prototype.concat.apply
并获得相同的结果。问题文本在哪里描述了预期的结果“一个52个元素的套装/数字对数组”@guest271314“我正在尝试创建一副52张卡片”。@meagar你说得对。我最初使用了双映射,得到了类似的13长度数组,每个数组元素都有[value[0],[suits]]。我需要查看reduce()方法。谢谢:)我可以问一下您的目标是提高脚本执行速度吗?您得到了未定义的
,因为
.forEach
不返回任何内容。将其更改为
.map
,并在该行的开头放一个
return
,它应该可以正常工作。就性能而言,如果这需要超过1ms,我会感到惊讶@sinisake-nah只是尝试学习新的操作方法,而不是嵌套循环。你是对的。但是如果我最初想使用诸如J、Q、K等面值(我可以稍后更改):@Jamie-将答案更改为使用原始的
数组。