如果值已经存在于数组中,则生成新的随机值

5

我有一个情况,需要使用protractor在页面上点击随机链接(有很多链接)。我有一个链接数组,不想点击它们,因此我想知道我的随机链接是否在该数组中,并生成一个新的随机链接。

下面是代码,用于在页面上单击随机链接:

var noClickArray = ['link2', 'link3']; // array much bigger than this
var parent = this;

function() {
  var links = element.all(by.css('.links'));
  return links.count().then(function(count) {
    var randomLink = links.get(Math.floor(Math.random() * count));
    randomLink.getText().then(function(text) {
      parent.selectedLink = text; // used in a different function
      var containsLink = _.includes(noClickArray, text);
    });
    return randomLink.click();
  });
}

我正在使用lodash查找randomLink文本是否在noClickArray中,但是我不知道如何保持生成随机值,直到该值不存在于数组中。我该如何做到这一点?


1
有没有一个单独的选择器来选择可选链接会更好呢?例如.clickableLinks,这样你就不需要遍历或过滤整个列表来检查它是否有效。 - DBS
或者使用一个对象,其中链接是键,这样您就可以轻松查看链接/键是否在对象中。 - IMTheNachoMan
2个回答

5

我认为您正在过度复杂化问题。 我会在使用filter()之前,只是筛选掉您不想点击的链接:

function() {
  var links = element.all(by.css('.links'));
  links = links.filter(function (link) {
      return link.getText().then(function(text) {
          return !_.includes(noClickArray, text);
      });
  });

  return links.count().then(function(count) {
    var randomLink = links.get(Math.floor(Math.random() * count));
    return randomLink.click();
  });
}

我通常倾向于把事情搞得更复杂 :) 这看起来像是一个非常简洁的解决方案。谢谢! - cocoa

3

您可以简单地使用递归调用,直到获取一个非黑名单链接为止。这样,您将避免获取所有链接的文本成本:

function() {
  return element.all(by.css('.links')).then(function clickRandom(links) {

    // remove a random link from the array of links
    var link = links.splice(Math.floor(Math.random() * links.length), 1)[0];

    return link && link.getText().then(function(text) {
      if(noClickArray.indexOf(text) === -1) {  // if not black listed
        return link.click();  // click link
      }
      return clickRandom(links); // try again
    });

  });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接