如果值在数组中,则生成新的随机值

时间:2016-07-22 16:22:49

标签: javascript arrays random 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中,但我不知道如何继续生成随机值,直到数组中不存在该值。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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();
  });
}

答案 1 :(得分: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
    });

  });
}