我想建立一个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如何),我想找出原因。
我一直在深入研究这个问题,我有一些见解。这看起来更像是一个qualtrics问题,而不是单纯的JS问题。然而,潜在的问题可能仍然与一些JS机制有关,这就是为什么我费心在这里更新它的原因--也许有人会知道是什么导致了这种行为。
总结一下--我想根据一个给定变量的内容是否匹配来决定一个动作的条件 要么 数组中的值。我试过使用这两个 includes
和 indexOf
但这两种方法都失败了。问题归根结底是由于函数没有做一个 确切 匹配。例如,如果我有一个5个数字的数组,如 8, 9, 12, 13, 14
我想测试一下 4
存在于数组中,那么完全匹配的结果应该是返回 FALSE
. 然而,这两个 indexOf
和 contains
返回 TRUE
因为 14
有 4
中。那么这就不是一个完全匹配的问题。此外,我试图调查什么是位置?indexOf
会返回这样一个假阳性匹配。通常情况下,它会返回一个甚至比数组总长度还大的位置,完全没有意义。下面是我的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之外测试同样的代码时,问题并没有复制。
谁有线索甚至假设一下,可能是匹配的问题?即使你不一定熟悉Qualtrics... ...
我从来没有使用过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