indexOf includes不做精确匹配,返回假阳性。

问题描述 投票:0回答:1

我想建立一个if语句,其中的 如果 标准是基于一个变量是否等于的平等检验。任何 的几个值。但是,我不想硬编码测试值,而是要传递一个之前随机子集的值数组。

首先我通过从15个值的数组中抽取5个值进行子集采样,得到随机值集。基本上,我使用 此良方.

function getRandomSubarray(arr, size) {
    var shuffled = arr.slice(0), i = arr.length, temp, index;
    while (i--) {
        index = Math.floor((i + 1) * Math.random());
        temp = shuffled[index];
        shuffled[index] = shuffled[i];
        shuffled[i] = temp;
    }
    return shuffled.slice(0, size);
}

var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var fiveRandomMembers = getRandomSubarray(x, 5);

那么我想通过 fiveRandomMembers 来测试一个变量是否等于在 fiveRandomMembers的数组。然后做一些事情。为此,我想用 此法.

var L = function()
{
    var obj = {};
    for(var i=0; i<arguments.length; i++)
        obj[arguments[i]] = null;

    return obj;
};

if(foo in L(fiveRandomMembers)) {
/// do something
};

不幸的是,这对我不起作用。我必须承认,这段代码是在Qualtrics调查中实现的,所以问题是 可能是 这就是Qualtrics平台的细微差别,这也是它不能为我工作的原因。我是JavaScript的新手,所以如果这是一个微不足道的问题,我很抱歉。但我相信我的代码即使在纯JavaScript中也有问题(也就是说,不管Qualtrics如何),我想找出原因。

更新2020-05-24

我一直在深入研究这个问题,我有一些见解。这看起来更像是一个qualtrics问题,而不是单纯的JS问题。然而,潜在的问题可能仍然与一些JS机制有关,这就是为什么我费心在这里更新它的原因--也许有人会知道是什么导致了这种行为。

总结一下--我想根据一个给定变量的内容是否匹配来决定一个动作的条件 要么 数组中的值。我试过使用这两个 includesindexOf但这两种方法都失败了。问题归根结底是由于函数没有做一个 确切 匹配。例如,如果我有一个5个数字的数组,如 8, 9, 12, 13, 14我想测试一下 4 存在于数组中,那么完全匹配的结果应该是返回 FALSE. 然而,这两个 indexOfcontains 返回 TRUE 因为 144 中。那么这就不是一个完全匹配的问题。此外,我试图调查什么是位置?indexOf 会返回这样一个假阳性匹配。通常情况下,它会返回一个甚至比数组总长度还大的位置,完全没有意义。下面是我的Qualtrics调查中的一个例子,证明了这个问题。

qualtrics

这段代码由两个Qualtrics问题组成:

(-) 第一个问题

Qualtrics.SurveyEngine.addOnReady(function()
{
    /*Place your JavaScript here to run when the page is fully displayed*/

    function getRandomSubarray(arr, size) {
    var shuffled = arr.slice(0), i = arr.length, temp, index;
    while (i--) {
        index = Math.floor((i + 1) * Math.random());
        temp = shuffled[index];
        shuffled[index] = shuffled[i];
        shuffled[i] = temp;
    }
    return shuffled.slice(0, size);
}

var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var fiveRandomMembers = getRandomSubarray(x, 5);

if (Array.isArray(fiveRandomMembers)) Qualtrics.SurveyEngine.setEmbeddedData('is_array', "TRUE");


Qualtrics.SurveyEngine.setEmbeddedData('length', fiveRandomMembers.length);


Qualtrics.SurveyEngine.setEmbeddedData('five_sampled_numbers', fiveRandomMembers);

});

(-)第二件

Qualtrics.SurveyEngine.addOnReady(function()
{
    jQuery("#"+this.questionId).find('.QuestionText:first').css("padding-bottom", "0px");


var currentLoopNum = "${lm://CurrentLoopNumber}";
    // var currentLoopNum = parseInt(currentLoopNum, 10); // tried converting to numeric but it doesn't solve the problem
var fiveSampledNumbers = "${e://Field/five_sampled_numbers}";

if (fiveSampledNumbers.includes(currentLoopNum)) {
   Qualtrics.SurveyEngine.setEmbeddedData('does_loop_number_appear', "Yes");
} else {
    Qualtrics.SurveyEngine.setEmbeddedData('does_loop_number_appear', "No");

}
    Qualtrics.SurveyEngine.setEmbeddedData('index_of', fiveSampledNumbers.indexOf(currentLoopNum));

});

这里是Qualtrics调查的链接,展示了这个问题,如果它对排除故障有帮助的话。: 链接


然而, 当在Qualtrics之外测试同样的代码时,问题并没有复制。

js_testing

谁有线索甚至假设一下,可能是匹配的问题?即使你不一定熟悉Qualtrics... ...

javascript arrays indexof qualtrics
1个回答
1
投票

我从来没有使用过Qualtrics,但对我来说,很明显的是,行

var fiveSampledNumbers = "${e://Field/five_sampled_numbers}";

将为其分配一个字符串值 fiveSampledNumbers,而不是一个数组值。

事实上,如果你试图在字符串而不是数组上运行检查,你会得到上面看到的意外结果,因为你正在进行字符串操作而不是数组操作。

var fiveSampledNumbers = "6,4,10,11,15";
console.log(fiveSampledNumbers.includes(5));  // logs true (string ends with the character "5")
console.log(fiveSampledNumbers.indexOf(5));   // logs 11   (index of the character "5")

为了解决这个问题,你必须用逗号分割字符串,并解析其中的每个数字。

var fiveSampledNumbers = "6,4,10,11,15";
fiveSampledNumbers = fiveSampledNumbers.split(",").map(function (n) { return parseInt(n, 10); });
console.log(fiveSampledNumbers.includes(5));  // logs false
console.log(fiveSampledNumbers.indexOf(5));   // logs -1
© www.soinside.com 2019 - 2024. All rights reserved.