下面的代码检查在某些情况下array1或array2是否包含连字符。如果是这样,这些连字符将被删除。然后,我比较两个数组,以检查一个数组中的某些元素是否包含在另一个数组中:
var array1 = ['banana-orange'];
var array2 = ['banana', 'orange'];
if (checkHyphen(array2) == true && checkHyphen(array1) == false) {
for (let i = 0; i < array2.length; i++) {
if (array2[i].includes('-')) {
array2[i] = array2[i].replace('-', ' ').split(' ');
}
}
} else if (checkHyphen(array2) == false && checkHyphen(array1) == true) {
for (let i = 0; i < array1.length; i++) {
if (array1[i].includes('-')) {
array1[i] = array1[i].replace('-', ' ').split(' ');
}
}
}
function checkHyphen(a) {
var finished = false;
for (let i = 0; i < a.length; i++) {
if (a[i].includes('-')) {
finished = true;
}
}
return finished;
}
console.log('array2 = ' + array2); //should match array1 - it does
console.log('array1 = ' + array1); //should match array2 - it does
console.log(array2.some(v => array1.includes(v)) == true); // returns false, should be true
如果两个数组都匹配,则显然some()应该返回true,但事实并非如此。我该如何解决?
注意:array1和array2不必总是完全匹配,一个或另一个可能具有更多的值。我只需要测试另一个元素中是否至少存在一个元素即可。
答案 0 :(得分:1)
问题是您要将数组的元素设置为另一个数组。因此,它创建了嵌套数组。在检查之前,您应该flat()
它们。
var array1 = ['banana-orange'];
var array2 = ['banana', 'orange'];
if (checkHyphen(array2) == true && checkHyphen(array1) == false) {
for (let i = 0; i < array2.length; i++) {
if (array2[i].includes('-')) {
array2[i] = array2[i].replace('-',' ').split(' ');
}
}
} else if (checkHyphen(array2) == false && checkHyphen(array1) == true) {
for (let i = 0; i < array1.length; i++) {
if (array1[i].includes('-')) {
array1[i] = array1[i].replace('-',' ').split(' ');
}
}
}
function checkHyphen(a) {
var finished = false;
for (let i = 0; i < a.length; i++) {
if (a[i].includes('-')) {
finished = true;
}
}
return finished;
}
array2 = array2.flat();
array1 = array1.flat();
console.log(array2.some(v => array1.includes(v)) == true);
您可以使用JSON.stringify()
替代flat()
array2 = String(array2).split(',');
array1 = String(array1).split(',');
这是您代码的简短版本。
var array1 = ['banana-orange'];
var array2 = ['banana', 'orange'];
if (checkHyphen(array1) && !checkHyphen(array2)) {
array1 = array1.flatMap(x => x.split('-'))
} else if (checkHyphen(array2) && !checkHyphen(array1)) {
array2 = array2.flatMap(x => x.split('-'))
}
function checkHyphen(a) {
return String(a).includes('-');
}
console.log(array2.some(v => array1.includes(v)));
答案 1 :(得分:0)
您应该定义一个函数来处理各个输入数组,而不是检查连字符,而是将函数拆分为任何连字符,然后将结果压入一个新数组。
const input1 = ['banana-orange', 'mango']
const input2 = ['banana', 'orange', 'apple-grape']
const input3 = ['mango']
function check(input1, input2) {
const process = input => input.reduce((result, value) => (result.push(...value.split(/-+/g)), result), [])
const processed = [input1, input2].map(input => process(input))
return processed[0].some(value => processed[1].includes(value))
}
console.log(check(input1, input2))
console.log(check(input1, input3))
console.log(check(input2, input3))