检查数组是否包含另一个的某些元素,返回错误结果

时间:2019-03-31 18:36:10

标签: javascript arrays

下面的代码检查在某些情况下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不必总是完全匹配,一个或另一个可能具有更多的值。我只需要测试另一个元素中是否至少存在一个元素即可。

JSfiddle

2 个答案:

答案 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))