javascript – 通过索引和匹配值过滤数组

我想要过滤掉一台老虎机的模式,在这种情况下,如果它们具有相同的值,我想要选择以下索引.

如果索引0,2和6具有相同的值,如果应该输出.
我正在想像这样的功能调用

if (win_filter([0, 2, 6] == "slot-2") {
    console.log("You won");
}

我的代码如下.

var final_score = new Array();

$(".shoot").click(function() {

  //var numbers_array = ["slot-1", "slot-1", "slot-1", "slot-1", "slot-1", "slot-2", "slot-2", "slot-2", "slot-2", "slot-3", "slot-3", "slot-3", "slot-4", "slot-4", "slot-5"];
  var numbers_array = ["slot-1", "slot-2", "slot-3", "slot-4", "slot-5"];
  var target = $("div.window table");

  target.find("tr td > div").each(function() {
    $(this).fadeOut(function() {
      $(this).removeAttr('class');
      $(this).addClass(numbers_array[Math.floor(Math.random() * numbers_array.length)]);
      $(this).fadeIn();
      final_score.push($(this).attr("class"));
    });
  });

  function filterResults(arr) {
    return final_score.filter(function(el) {
      return arr.some(function(e) {
        return el.timeframe == e;
      });
    });
  }

  var result = filterResults(['0','2','6']);
  console.log(result);

  $.each(numbers_array, function(index, value) {
    if (result == value) {
      $(".notice").html("You have won.").addClass("success").show();
      console.log("You won!");
    }
  });
  console.log(final_score);
});

编辑

如果不清楚,我的意思是数组中的索引,如果我从这个生成的数组中选择了索引0,2和6,那么它们的值将是(即使它们不一样).

0 => "slot-2", 2 => "slot-5", 6 => "slot-1"

目的是检查所选索引是否具有相同的值输出.
索引的数量不应该被硬编码,它可以是从3个索引搜索到5个索引搜索的任何东西.

jsFiddle.net

Array[0]
0 : "slot-2"
1 : "slot-3"
2 : "slot-5"
3 : "slot-5"
4 : "slot-4"
5 : "slot-3"
6 : "slot-1"
7 : "slot-4"
8 : "slot-1"
9 : "slot-2"
10 : "slot-2"
11 : "slot-4"
12 : "slot-5"
13 : "slot-1"
14 : "slot-4"
首先,我避免对你的代码进行任何重大的修改,所以在jsfiddle我写了验证确切地在你所期望的(在(点击))内.

我做了什么:

在计算任何东西之前,我们需要插槽数据.你已经将它保存在final_score内,但是这样做的功能是一个回调.是否值得等待回调? – 我不这么认为,因为它是一个简单的css(fadeOut)动画.

const classVal = numbers_array[Math.floor(Math.random() * numbers_array.length)];
$(this.fadeOut(function() { // Rest of your code }
final_score.push(classVal);

计算每一行的长度,你知道它们都是相等的长度,并且你的全部都在数组中(final_score),所以简单的划分线就足够了.

const lines = 3;
const lineLength = final_score.length/lines;

对于每行,我们检查其他行值是否与此相同.鉴于您的数组顺序不是基于显示顺序,而是基于您生成的顺序,我们可以简单地检查具有相同索引(但是遍历每一行)的顺序.

final_score [i] === final_score [i lineLength]& amp;& final_score [i] === final_score [i lineLength * 2]

导致:

  const lineLength = final_score.length/3;
  for(let i=0; i<lineLength; i++) {
    if (final_score[i] === final_score[i+lineLength] && final_score[i] === final_score[i+lineLength*2]) {
      console.info(`win col ${i}`);
    }
  }

如果你需要它,你可以很容易地这样做.

  const lineLength = final_score.length/3;
  for(let i=0; i<lineLength; i++) {
    const lineOneSlot = final_score[i];
    let allEqual = true;
    for (let j=1; j<lines; j++) {
        console.info(`Comparing ${i} ${i+lineLength*j}`);
        if (lineOneSlot !== final_score[i+lineLength*j]) {
        allEqual = false;
        break;
      }
    }
    if (allEqual) {
      console.info(`win col ${i}`);
    }
  }

既然你要求对角线检查,它会像这样:

但是,您必须确保网格是平方的,以获得预期的结果.否则,您必须重新定义在这些情况下要做的事情.

final_score [i] === final_score [i 1 lineLength]&& final_score [i] === final_score [i line lineLength * line]

https://jsfiddle.net/qjp7g0qL/3/

翻译自:https://stackoverflow.com/questions/41550195/filtering-array-by-index-and-matching-values

转载注明原文:javascript – 通过索引和匹配值过滤数组