如果第一个数组有 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
是数字2
,data2[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_employees
和 data2[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_employees
和 data2[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>
我有两个数组,一个是用户 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
是数字2
,data2[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_employees
和 data2[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_employees
和 data2[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>