javascript - 在javascript中比较数组

标签 javascript

我要制作的是乐透游戏的核对 list ,这是我家人的一种宾果游戏。 我将首先尝试解释 list 的作用和原因,请原谅我的技术英语,我是荷兰人,所以有些词可能是错误的:)

我有一个名单,上面有几个玩乐透/宾果游戏的人。所有玩家都选择 10 个号码,每周抽取一次 6 个号码,我尝试逐步解释代码必须做什么。

要查1-10人的号码
每周加2-6个号,要和人数比较。
3 - 匹配时字体应为绿色。
4 - 没有匹配项时字体应保持红色

这是我到目前为止的代码,a live version is at the link .

下面的代码运行良好,但问题是代码旨在比较 var A 和 var B,这是一个瓶颈,因为它是一对一的操作。如果不添加抽奖日,我就无法添加更多人。

现在我的问题。在不添加像 B2 这样的开奖日期的情况下,应该如何添加更多人(A1、A2、A3 等)。

我希望这已经足够清楚了。 :)

<script type = "text/javascript">


var a1 = ["2","3","8","12","23", "37", "41", "45", "48"]
var a2 = ["2","14","3","12","24", "37", "41", "46", "48"]

var b1 = ["2","5", "11","16","23","45", "46"];
var b2 = ["1","23", "11","14","23","42", "46"];




for (var i = 0; i< a1.length; i++) 
{
    for (var j = 0; j< b1.length; j++) 
    {
        if (a1[i] == b1[j]) 
        {
            a1[i]= "g"+ a1[i];
        }
    }
}

for (var i = 0; i< a2.length; i++)
{
    for (var j = 0; j< b2.length; j++)
    {
        if (a2[i] == b2[j]) {
            a2[i]= "g"+ a2[i];
        }
    }
}

// john
document.write("<font color = '#FFFFFF'>" + "<b>" + "John &nbsp&nbsp " + "</b>");
for (var i = 0; i< a1.length; i++) 
{
    if (a1[i].substr(0,1) == "g") 
    {
        a1[i] = a1[i].substr(1,20);
        document.write("<font color = '#00FF00'>", a1[i] + " &nbsp&nbsp ");
    }
    else
    {
        document.write("<font color = '#FF0000'>", a1[i] + " &nbsp&nbsp ");
    }
}

// Michael
document.write("<br><br>");
document.write("<font color = '#FFFFFF'>" + "<b>" + "Michael &nbsp&nbsp " + "</b>");
for (var i = 0; i< a2.length; i++) 
{
    if (a2[i].substr(0,1) == "g") 
    {
        a2[i] = a2[i].substr(1,20);

        // The Draw    
        document.write("<font color = '#00FF00'>", a2[i] + " &nbsp&nbsp ");
    }
    else
    {
        document.write("<font color = '#FF0000'>", a2[i] + " &nbsp&nbsp ");
    }
}
document.write("<br><br>");
document.write("<br><br>");
document.write("<font color = '#FFFFFF'>" + "<b>" + "Draw day 1 " + "</b>");
document.write("<br>");
document.write("<font color = '#FFFFFF'>" + "<b>" + "Sat 08-08-2009 " + "</b>");
document.write("<br><br>");
for (var j = 0; j< b1.length; j++) 
{
    document.write("<font color = '#FFFFFF'>", b1[j] + " &nbsp&nbsp ");    
}
document.write("<br><br>");
document.write("<br><br>");
document.write("<font color = '#FFFFFF'>" + "<b>" + "Draw day 2 " + "</b>");
document.write("<br>");
document.write("<font color = '#FFFFFF'>" + "<b>" + "Sat 15-08-2009 " + "</b>");
document.write("<br><br>");

for (var j = 0; j< b2.length; j++) 
{
    document.write("<font color = '#FFFFFF'>", b2[j] + " &nbsp&nbsp ");
}
</script>

最佳答案

除了像 Miky D 那样重写代码(重构)以便将数组比较转换为函数之外,您还可以通过使用对象来保存中奖号码来提高比较效率。请注意,此代码不是最终版本;还有进一步的改进。

var guesses = [["2","3","8","12","23", "37", "41", "45", "48"],
               ["2","14","3","12","24", "37", "41", "46", "48"]];
var draws = [ {2:1, 5:1, 11:1, 16:1, 23:1, 45:1, 46:1},
                {1:1, 23:1, 11:1, 14:1, 23:1, 42:1, 46:1}];

function checkArray(guesses, draw) {
    for (var i = 0; i< guesses.length; ++i) {
        if (draw[guesses[i]]) {
            guesses[i] = 'g' + guesses[i];
        }
    }
}
checkArray(guesses[0], draws[1]);

通过将中奖号码转换为索引而不是值,您可以摆脱循环。此外,“a”和“b”不是非常具有描述性的名称。短名称只会让您感到困惑。

通过以不同方式标记成功和成功的猜测(目前,您在成功前面加上“g”),您还可以简化代码以显示结果。 <font>标签已被弃用一段时间,因此此优化使用 <span>有一个你可以设置样式的类。

function checkArray(guesses, draw) {
    var results = {}
    for (var i = 0; i< guesses.length; ++i) {
        if (draw.picks[guesses[i]]) {
            results[guesses[i]] = 'win';
        } else {
            results[guesses[i]] = 'loss';
        }
    }
    return results;
}
...
document.write('<span class="name">John</span>');
var results = checkArray(guesses[0], draws[1]);
for (var p in results) {
    document.write('<span class="'+results[i]+'">'+p+'</span>');
}

document.write也已弃用,我将用现代等效项替换它, document.createElement Node.appendChild .如果您认为生成的代码过于冗长,您可以改用 innerHTML , 虽然它的用途是 controversial .由于球员姓名与球员选秀权密切相关,因此我还将按球员姓名为球员选秀权编制索引。

将以下内容放入与网页相同的文件夹中名为“lotto.js”的文件中。

function Result(guesses) {
    for (var i = 0; i< guesses.length; ++i) {
        this[guesses[i]] = '';
    }
}
function checkDraw(guesses, draw, results) {
    for (var i = 0; i< guesses.length; ++i) {
        if (draw.picks[guesses[i]]) {
            results[guesses[i]] = 'picked';
        }
    }
    return results;
}

function appendTo(elt, parent) {
    if (parent) {
        document.getElementById(parent).appendChild(elt);
    } else {
        document.body.appendChild(elt);
    }
}

function printResults(name, results, parent) {
    var resultElt = document.createElement('div');
    resultElt.appendChild(document.createElement('span'));
    resultElt.firstChild.appendChild(document.createTextNode(name));
    resultElt.firstChild.className='name';
    var picks = document.createElement('ol');
    picks.className='picks';
    for (var p in results) {
        picks.appendChild(document.createElement('li'));
        picks.lastChild.appendChild(document.createTextNode(p));
        picks.lastChild.className = results[p];
    }
    resultElt.appendChild(picks);
    appendTo(resultElt, parent);
}

function printResultsFor(name, draws, parent) {
    var player = players[name];
    var results = new Result(player);
    for (var i=0; i<draws.length; ++i) {
        checkDraw(player, draws[i], results);
    }
    printResults(name, results, parent);
}

function printDraw(which, draw, parent) {
    var drawElt = document.createElement('div');
    drawElt.className='draw';
    drawElt.appendChild(document.createElement('h3'));
    drawElt.lastChild.appendChild(document.createTextNode('Draw '+which));
    drawElt.lastChild.className='drawNum';
    drawElt.appendChild(document.createElement('div'));
    drawElt.lastChild.className='date';
    drawElt.lastChild.appendChild(document.createTextNode(draw.when));
    var picks = document.createElement('ol');
    picks.className='picks';
    for (var p in draw.picks) {
        picks.appendChild(document.createElement('li'));
        picks.lastChild.appendChild(document.createTextNode(p));
    }
    drawElt.appendChild(picks);
    appendTo(drawElt, parent);
}

这是相应的 HTML 页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <style type="text/css">
      body {
        font-family: Verdana, Arial, Helvetica, sans-serif;
        color: white;
        background-color: #333;
      }
      .picks, .picks * {
        display: inline;
        margin: 0;
        padding: 0;
        list-style-type: none;
      }
      .picks * {
        margin: auto 0.25em;
      }
      #Results .picks * { color: red; }
      .name, .picks .name {
        color: white;
        font-weight: bold;
        margin-right: 0.5em;
      }
      #Results .picked { color: lime; }
      .drawNum, #Draws H3 {
          margin-bottom: 0;
      }
    </style>
    <script type="text/javascript" src="lotto.js"></script>
  </head>
  <body>
    <div id="Results"></div>
    <div id="Draws"></div>
    <script type="text/javascript">
    var players = {John:    [2,  3, 8, 12, 23, 37, 41, 45, 48],
                   Michael: [2, 14, 3, 12, 24, 37, 41, 46, 48]};

    var draws = [ {when: 'Sat 08-08-2009',
                   picks:{2:1, 5:1, 11:1, 16:1, 23:1, 45:1, 46:1}},
                  {when: 'Sat 15-08-2009',
                   picks:{1:1, 23:1, 11:1, 14:1, 23:1, 42:1, 46:1}}];

    for (name in players) {
      printResultsFor(name, draws, 'Results');
    }
    for (var i=0; i<draws.length; ++i) {
      printDraw(i+1, draws[i]);
    }
    </script>
  </body>
</html>

您可以优化 CSS 以获得您想要的确切样式。可以进一步重构代码以使用 OOP,这将简化创建新玩家和抽奖的过程,但涉及的内容更多,因此我不会在这里深入讨论。

更新:重写了上面的代码,以便将每个玩家的猜测与每次抽奖进行比较。 live sample version的代码已经重构几乎面目全非使用 OOP。它还使用您以前可能从未见过的功能,例如 JS closures , higher order functions和 CSS generated content and counters .它更长且更难理解,但更灵活且更易于使用。

关于javascript - 在javascript中比较数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1282528/

相关文章:

javascript - Node.js 最简单的代码不起作用

javascript - 从选择列表中删除项目 (Internet Explorer 10)

javascript - 在网页上有不可见的表单,并希望在使用 DojoToolkit 单击按钮时使它们可见,但不确定我的代码有什么问题

javascript - 在 Javascript 中调整图像大小后如何获取图像文件大小?

javascript - 有没有办法让我的搜索结果列表一次只显示一个结果?

javascript - 使用 JQuery 隐藏动态创建的标签

javascript - 如何添加到特定索引处的 JavaScript 计算

javascript - 在 $(document).ready 期间无法更改在 $(document).ready 期间添加的元素

javascript - Aurelia click.delegate 或 click.trigger 在克隆元素中不起作用

javascript - highcharts minPointLength 不适用于非堆叠条形图