【问题标题】:Build dynamic multi-dimensional array构建动态多维数组
【发布时间】:2013-05-18 23:04:42
【问题描述】:

我正在尝试动态构建一个多维数组。

我想动态构建它的原因是,如果数组增长到 1 - 1000 的 5 个数字块。
这样写会很费时间:

[1, 2, 3, 4, 5],,,,,[996, 997, 998, 999, 1000]

我今天一整天都在挣扎,所以我决定发布这个问题,因为我现在完全陷入困境。

这是我要动态构建的数组(我之前的帖子已解决):
Multi-dimensional array shuffle random

正确构建动态数组后,我想使用 'outerArr.forEach(fisherYates);' 调用 FisherYates() 函数得到这样的结果:

[4,2,3,5,1],[7,10,6,9,8],[11,15,12,14,13],[18,17,16,20,19],[22,21,25,23,24]


该数组将用于淡出/淡入图片。
1. 淡入第一组五张随机图片 1-5
2.fadeOut先设置
3.fadeIn第二组5张随机图片6-10
4.fadeOut第二套
5.fadeIn 第三组随机五张图片 11-15
6.等等....

我将使用这样的数组值:

$currImg = $('.rotator-image:visible', $currLi);
$next = $('.img' + outerArr[a][b], $currLi);
$currImg.fadeOut(1000);
$next.fadeIn(1000);

我已尝试通过以下链接解决此问题:
jQuery.map
Create multidimentional array with dynamic form
Pointy 的代码在this post

一些注意事项:我不喜欢使用"var outerArr = new Array();"。我在某处读到应该避免它(?)。如果可能的话,我想用 .push 和 $.makeArray (和 $.map)以 jQuery 方式完成此操作。但是,任何方法都值得赞赏。

这是我的代码(增加 JSfiddle 中的 Javascript 窗口以查看我的 cmets):(以及 here

function fisherYates(myArray) {
    var i = myArray.length, j, tempi, tempj;
    if (i === 0) return false;
    while (--i) {
        j = Math.floor(Math.random() * (i + 1));
        tempi = myArray[i];
        tempj = myArray[j];
        myArray[i] = tempj;
        myArray[j] = tempi;
    }
}

var outerArr = [];
var innerArr = [];
var fakeArr = 0;
var zz = 0;

for (var z = 1; z < 26; ++z) {
    ++zz;
    if (zz != 5) {
        fakeArr = fakeArr + z + ",";
    } else {
       fakeArr = fakeArr + z;
       var realArr = $.makeArray(fakeArr);
       innerArr.push(realArr);
       outerArr.push(innerArr);
       innerArr = [];
       innerArr.length = 0;
       fakeArr = "";
       fakeArr.length = 0;
       zz = 0;
    }
}
// Shuffle/Randomize the numbers in each chunk but not the order of the five chunks
outerArr.forEach(fisherYates);
alert(outerArr);

问题是当我想从数组中获取值时。我没有得到单个值(比如 outerArr[1][3] 应该显示 9)。我只得到每个完整的块(如 6、7、8、9、10)。我相信我必须使用 $.map 但我不知道如何在我的示例中使用 $.map。 shuffle/random 函数(即outerArr.forEach(fisherYates);)也不能像现在的代码那样工作。

数组也应该是随机的(如顶部第一个链接中所述),但一旦我让动态部分工作,我应该能够让随机/随机工作。

【问题讨论】:

  • $.makeArray(fakeArr) 并没有像你想象的那样做。它需要一个对象作为输入,而不是字符串。
  • 谢谢。好的,这就解释了。我可能不得不考虑另一种方法,就像 Michael Geary 建议的那样,使用 Lo-Dash。

标签: jquery multidimensional-array


【解决方案1】:

您认为应该使用 jQuery 来执行此操作的想法确实走错了路。这种代码与 jQuery 擅长的完全不同。 jQuery 是一个 DOM 操作 库,而不是用于这种编码的通用 JavaScript 库。

如果您想要一个对此类数组操作有用的库,一个好的起点是underscore.js 或类似但更新的Lo-Dash。这些库具有各种数组和对象操作功能。最好查看这两个库的文档,看看它们是否有帮助。 (阅读文档后,如果您不确定该选择哪一个,您不会出错,但我的建议是 Lo-Dash。)

否则,您应该只编写纯 JavaScript 代码,使用老式循环之类的东西。

一些注意事项:我不喜欢使用var outerArr = new Array();。我在某处读到它应该避免(?)。

您使用的是var outerArr = [];。这很好,而且确实是这些天推荐的做法。但这只是外观上的差异。 new Array()[] 表示完全相同的东西并且工作方式相同。将一个更改为另一个不会导致任何问题或解决任何问题。

此外,您的代码中的缩进是一团糟。无法分辨哪些语句嵌套在什么内部。所以我冒昧地清理了压痕。请检查它并确保我做对了。

我看到你的代码中有一个fisherYates() 函数,但这个函数从未被调用过。不知道这是怎么回事,也许你可以澄清一下。

假数组有什么用?为什么需要假数组和真数组?

这段代码有两个什么都不做的语句:

   innerArr = [];
   innerArr.length = 0;  // does nothing
   fakeArr = "";
   fakeArr.length = 0;  // does nothing

innerArrfakeArr 的长度都已经为零,因为它们的值分别是 []"",因此无需再次将 length 设置为零。

还有一个最后的建议:也许不要试图立即写出 JavaScript 代码,而应该用英文写出——非常详细——确切地输入是什么,输出是什么,以及你认为哪些步骤会帮助你那里。您发布的描述已经完成了一半,但是缺少很多细节。如果您可以用英文或伪代码写出所有这些细节,则可能有助于更轻松地编写实际代码。

我知道这并不能回答你的问题,但它应该让你深思! :-)

【讨论】:

  • 感谢您对“DOM 操作”的提醒。我现在更好地理解它了。我会看看 Lo-Dash。对缩进感到抱歉。感谢编辑,现在看起来真的很好。我最初的问题是如何制作一个动态数组,而不是如何洗牌,所以我更新了我的帖子......(由于字符输入限制,在下一个答案中继续)
  • ...继续... 目前我正在寻找一个合适的域名。一旦我有了它,我将发布一个完整示例的链接,并在“艰苦的细节 - 英文”中提供完整的解释。在论坛提问时,我完全理解完整解释的价值。你说,你没有回答我的问题,但是你给了我,作为一个有点新手的程序员,我非常感激的有价值的信息。谢谢!
  • 啊,现在我跟着你在假阵列上。我认为 jQuery .map 文档中的示例实际上只是为了说明如何将“类数组对象”转换为实际的Array。例如,当您调用 $(foo) 时,它会返回一个 jQuery 对象,该对象不是实际数组,但确实具有 .length 属性和 [0][1] 等元素。但是您可以使用$.makeArray() 创建一个真正的Array。在您正在编写的普通 JavaScript 代码中,您很少需要这样做。
  • 写出“煞费苦心的细节”的想法既是为了帮助其他人理解问题,更重要的是帮助确保理解它。有时我对问题的理解已经足够深入并直接编写代码,但有时我不太确定我需要的算法的一些细节。那时,在尝试用我正在编码的任何语言编写实际代码之前,用英语或伪代码写出描述会很有帮助。
  • 顺便说一句,您可以使用jsfiddle 发布代码,因此您甚至不必担心域名或托管。
【解决方案2】:

在用户 Michael Geary 和 nnnnnn 的帮助下,他们之前回答了我的问题,经过四处搜索,我得到了解决方案。我在this 帖子中找到了一段代码,对我有帮助。

我正在寻找的代码如下所示。也发布在 JSFiddle 与 cmets。请展开 JSFiddle javascript 窗口以获取长 cmets。

function fisherYates(myArray) {
    var i = myArray.length, j, tempi, tempj;
    if (i === 0) return false;
    while (--i) {
        j = Math.floor(Math.random() * (i + 1));
        tempi = myArray[i];
        tempj = myArray[j];
        myArray[i] = tempj;
        myArray[j] = tempi;
    }
}

var outerArr = [];
var innerArr = [];
var f = 0;

for (var z = 1; z < 27; ++z) {
    ++f;
    if (f <= 5) {
        innerArr.push(z);
    } else {
        outerArr.push(innerArr);
        innerArr = [];
        f = 0;
        --z;
    }
}

alert(outerArr);
outerArr.forEach(fisherYates);
alert(outerArr);
alert(outerArr[0][0]);
alert(outerArr[4][4]);

由于我没有声望 15 我不能 +1 Michael Geary 的回答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多