如果第一个数组有 2 而第二个数组有 22,javascript 中的模式匹配返回 true 我该如何解决这个问题?

Pattern Matching in javascript returning true if first array has 2 and second array has 22 How do i solve this?

我有两个数组,一个是用户 ID,另一个是用户 ID。这些数组如下。

1)拥有用户id的数组。 data[key].effective_employees 等于 [2].

现在我有另一个数组,其中包含员工 ID 的数量,如下所示。 data2[0].id 等于 [2,22,21].

现在我正在尝试查看数组 2 是否包含数组 1 中的数字我正在使用以下逻辑来查看它是否正常工作。

if ((/^\d+$/.test(_.intersection([data2[0].id.toString()], data[key].effective_employees)))) {
    let isElem = _.contains(returnStackFilterd, value);
    if (isElem == false) {
        returnStackFilterd.push(value);
    }
} else {
    returnStackFilterd = _.without(returnStackFilterd, value);
}

但是如果数组 2 有 22,则这对于数字 2 显示为真。它所发生的伪代码如下。

if([2]is in[22,21]){ it is printing true} I want false here as the number two is not in the second array. The second array contains 22 and 21 which is not eaqual to 2

我该如何解决这个问题?上面的伪代码应该打印 false.

如果data[key].effective_employees是数字2data2[0].id是数组[2, 22, 21],判断data2[0].id是否包含data[key].effective_employees的表达式] 是:

data2[0].id.includes(data[key].effective_employees)

从你原来的问题来看,data2[0].id.toString() 将数组强制转换为字符串 2,22,21,这对你没有用。您也不需要为此使用下划线。

让我们分解你的测试表达式,看看它为什么不起作用。

首先,我们知道 data[key].effective_employees[2]data2[0].id 可能是 [2, 22, 21][22, 21]。如果我正确理解您的问题,您希望整个测试表达式在第一种情况下为 return true,在第二种情况下为 false

从下往上重建你的测试表达式,我们找到的最里面的表达式是这样的:

data2[0].id.toString()

这是一个字符串,其值为 '2,22,21''22,21',具体取决于我们讨论的是哪种情况。接下来,将此字符串包装在一个数组中:

[data2[0].id.toString()]

所以现在我们有 ['2,22,21']['22,21']。注意引号;在任何一种情况下,它都是一个包含单个元素的数组,该元素是一个字符串。

接下来,你取这个数组与 data[key].effective_employees 的交集,我们知道它是 [2]:

_.intersection([data2[0].id.toString()], data[key].effective_employees)

所以这个表达式是有效的

_.intersection(['2,22,21'], [2])

_.intersection(['22,21'], [2])

您总是取两个数组的交集,其中第一个包含单个字符串,第二个包含一个数字。它们不能有任何共同的元素,所以这总是会产生一个空数组 ([])。

最后,您测试该空数组是否与正则表达式匹配:

/^\d+$/.test(_.intersection([data2[0].id.toString()], data[key].effective_employees))
// is effectively the same as
/^\d+$/.test([])

正则表达式应该匹配字符串,而不是数组。 JavaScript 在这种情况下非常宽松,并且会强制您传递给字符串的值。这意味着值 [] 在与正则表达式 /^\d+$/ 匹配之前首先被转换为空字符串 ''。空字符串不包含任何数字,所以这个测试总是 returns false.

这就是您的测试未按预期运行的原因。但是,让我们退后几步,因为您似乎在做很多不需要做的事情。为什么要将数组转换为字符串(然后再转换回数组)?如果你只是想知道两个数组是否有共同的元素,为什么要匹配正则表达式?

以下更简单的表达式将为您提供 data[key].effective_employeesdata2[0].id 的共同点:

_.intersection(data[key].effective_employees, data2[0].id)

这将计算为 [2][],具体取决于 data[key].effective_employees 是否包含数字 2

我建议将这个表达式的结果保存到一个变量中,因为它使您的代码更易于阅读。我们称它为 commonIds:

const commonIds = _.intersection(data[key].effective_employees, data2[0].id)

现在您可以根据您希望这个交叉点的具体情况制定不同的条件。我的印象是你只是希望它是非空的(即,至少有一个共同的元素)。在这种情况下,您可以将其长度与零进行比较:

if (commonIds.length > 0) {
    // code for when there is an overlap
} else {
    // code for when there is no overlap
}

最后一点,我建议您也将基本表达式 data[key].effective_employeesdata2[0].id 分配给变量。同样,这使您的代码更具可读性,并且还确保如果这些基本表达式发生变化,您只需更改一行代码。把它们放在一起:

const key = 'x';
const data = { [key]: {
    effective_employees: [2],
}};
const data2 = [{
    id: [2, 22, 21],
}];

const userId = data[key].effective_employees;
const employeeIds = data2[0].id;
const commonIds = _.intersection(userId, employeeIds);

if (commonIds.length > 0) {
    console.log('userId appears in employeeIds');
} else {
    console.log('userId does not appear in employeeIds');
}
<script src="https://underscorejs.org/underscore-umd-min.js"></script>