gpt4 book ai didi

javascript - 从 2D 数组生成 3D 数组

转载 作者:搜寻专家 更新时间:2023-11-01 05:29:16 24 4
gpt4 key购买 nike

我正在尝试创建一个音乐游戏,我必须从基本的 2D 数组生成 3D 数组。计划是在修改之前将2D数组复制并粘贴到3D数组中4次,如图所示:

var note3base = [
["C", "E", "G"],
["C#", "E#", "G#"],
["Db", "F", "Ab"],
["D", "F#", "A"],
["Eb", "G", "Bb"],
["E", "G#", "B"],
["F", "A", "C"],
["F#", "A#", "C#"],
["Gb", "Bb", "Db"],
["G", "B", "D"],
["Ab", "C", "Eb"],
["A", "C#", "E"],
["Bb", "D", "F"],
["B", "D#", "F#"],
["Cb", "Eb", "Gb"]
];

var note3 = new Array(4);

for (h=0;h<note3.length;h++){
note3[h] = note3base;
} //creates 4 copies of note3base in a 3d-array to be modified

for (i=0;i<note3[0].length;i++){
note3[1][i][1] = flat(note3[1][i][1]); //minor
note3[2][i][1] = flat(note3[2][i][1]);
note3[2][i][2] = flat(note3[2][i][2]); //dim
note3[3][i][2] = sharp(note3[3][i][2]); //aug
} //how did everything become the same?

现在的问题似乎是 for 循环似乎将该方法应用于每个数组(0 到 3)。

note3[0][1] 的期望输出为 C E G,note3[1][1] 为 C Eb G,note[2][1] 为 C Eb Gb,note[3][1 ] 将是 C E G#。

非常感谢任何帮助!

我在下面包含了(有效的)尖锐和扁平方法以供引用:

function sharp(note){
var newnote;
if (note.charAt(1) == "#"){
newnote = note.replace("#", "x");
} else if (note.charAt(1) == "b"){
newnote = note.replace("b", "");
} else {
newnote = note + "#";
}
return newnote;
}

function flat(note){
var newnote;
if (note.charAt(1) == "#"){
newnote = note.replace("#", "");
} else {
newnote = note + "b";
}
return newnote;
}

最佳答案

问题是当你分配一个等于数组的变量时:

someVar = someArray;

...它不会复制数组,它会创建对相同 数组的第二个引用。 (这适用于所有对象,数组是一种对象。)所以在你的循环之后,你说:

for (h=0;h<note3.length;h++){
note3[h] = note3base;

...note3 中的所有元素都引用相同的底层数组。

要进行实际复制,您可以使用循环手动复制所有元素,或者您可以使用 .slice() method为您制作副本:

for (h=0;h<note3.length;h++){
note3[h] = note3base.slice();
}

但这只能解决一半的问题,因为 note3base 本身包含对其他数组的引用,而 .slice() 只会复制这些引用。也就是说,尽管 note3[0]note3[1](以及 2 和 3)将引用不同的数组,note3[0][0]note3[1][0]note3[2][0]note3[3][0] 将引用到相同的 ["C", "E", "G"] 数组。 (等等。)

您需要所谓的“深拷贝”。您可以使用嵌套循环来完成:

for (h=0;h<note3.length;h++){
// create this element as a new empty array:
note3[h] = [];
// for each 3-note array in note3base
for (var k = 0; k < note3base.length; k++) {
// make a copy with slice
note3[h][k] = note3base[k].slice();
}
}

说了这么多,我认为一个更简单的方法来完成整个事情,而不是使用一个引用数组的 note3base variable,将它变成一个函数返回一个新数组:

function makeNote3Array() {
return [
["C", "E", "G"],
["C#", "E#", "G#"],
["Db", "F", "Ab"],
["D", "F#", "A"],
["Eb", "G", "Bb"],
["E", "G#", "B"],
["F", "A", "C"],
["F#", "A#", "C#"],
["Gb", "Bb", "Db"],
["G", "B", "D"],
["Ab", "C", "Eb"],
["A", "C#", "E"],
["Bb", "D", "F"],
["B", "D#", "F#"],
["Cb", "Eb", "Gb"]
];
}

因为该函数使用数组文字,所以每次调用时都会创建一个全新的数组数组。因此,您可以执行以下操作,而无需 .slice() 或嵌套循环:

var note3 = new Array(4);
for (h=0;h<note3.length;h++){
note3[h] = makeNote3Array();
}

关于javascript - 从 2D 数组生成 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37806757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com