我有一个目标数组[“apple”、“banana”、“orange”],我想检查其他数组是否包含任何一个目标阵列元素。

例如:

["apple","grape"] //returns true;

["apple","banana","pineapple"] //returns true;

["grape", "pineapple"] //returns false;

如何在JavaScript中实现?


当前回答

您正在寻找两个数组之间的交集。你有两种主要的交叉点类型:“每个”和“一些”。让我举几个好例子:

let brands1 = ['Ford', 'Kia', 'VW', 'Audi'];
let brands2 = ['Audi', 'Kia'];
// Find 'every' brand intersection. 
// Meaning all elements inside 'brands2' must be present in 'brands1':
let intersectionEvery = brands2.every( brand => brands1.includes(brand) );
if (intersectionEvery) {
    const differenceList = brands1.filter(brand => !brands2.includes(brand));
    console.log('difference list:', differenceList);
    const commonList = brands1.filter(brand => brands2.includes(brand));
    console.log('common list:', commonList);
}

如果条件不满足(比如你在品牌中加入了“梅赛德斯”),那么“intersectionEvery”就不满足了——这将是错误的。

如果满足条件,它将把[“福特”、“大众”]列为区别,把[“起亚”、“奥迪”]列为了常见列表。

沙盒:https://jsfiddle.net/bqmg14t6/

SOME

let brands1 = ['Ford', 'Kia', 'VW', 'Audi'];
let brands2 = ['Audi', 'Kia', 'Mercedes', 'Land Rover'];
// Find 'some' brand intersection. 
// Meaning some elements inside 'brands2' must be also present in 'brands1':
let intersectionSome = brands2.some( brand => brands1.includes(brand) );
if (intersectionSome) {
    const differenceList = brands1.filter(brand => !brands2.includes(brand));
    console.log('difference list:', differenceList);
    const commonList = brands1.filter(brand => brands2.includes(brand));
    console.log('common list:', commonList);
}

我们在这里寻找一些常见的品牌,但不一定全部。

它将把[“福特”、“大众”]列为不同品牌,把[“起亚”、“奥迪”]列为了共同品牌。

沙盒:https://jsfiddle.net/zkq9j3Lh/

其他回答

添加到阵列原型

免责声明:许多人强烈建议不要这样做。唯一真正有问题的是,如果一个库添加了一个同名(行为不同)的原型函数或类似的东西。

代码:

Array.prototype.containsAny = function(arr) {
    return this.some(
        (v) => (arr.indexOf(v) >= 0)
    )
}

不使用大箭头功能:

Array.prototype.containsAny = function(arr) {
    return this.some(function (v) {
        return arr.indexOf(v) >= 0
    })
}

用法

var a = ["a","b"]

console.log(a.containsAny(["b","z"]))    // Outputs true

console.log(a.containsAny(["z"]))    // Outputs false
console.log("searching Array: "+finding_array);
console.log("searching in:"+reference_array);
var check_match_counter = 0;
for (var j = finding_array.length - 1; j >= 0; j--) 
{
    if(reference_array.indexOf(finding_array[j]) > 0)
    {
        check_match_counter = check_match_counter + 1;
    }
}
 var match = (check_match_counter > 0) ? true : false;
console.log("Final result:"+match);

您可以使用lodash并执行以下操作:

_.intersection(originalTarget, arrayToCheck).length > 0

在两个集合上进行集合交集,生成一个相同元素的数组。

具有部分匹配和不区分大小写的Vanilla JS

以前的一些方法的问题是,它们需要每个单词的精确匹配。但是,如果您想提供部分匹配的结果呢?

function search(arrayToSearch, wordsToSearch) {
    arrayToSearch.filter(v => 
        wordsToSearch.every(w => 
            v.toLowerCase().split(" ").
                reduce((isIn, h) => isIn || String(h).indexOf(w) >= 0, false)
            )
        )
}
//Usage
var myArray = ["Attach tag", "Attaching tags", "Blah blah blah"];
var searchText = "Tag attach";
var searchArr = searchText.toLowerCase().split(" "); //["tag", "attach"]

var matches = search(myArray, searchArr);
//Will return
//["Attach tag", "Attaching tags"]

当您希望提供一个搜索框,用户可以在其中键入单词,结果可以以任何顺序、位置和大小写显示这些单词时,这非常有用。

就我个人而言,我会使用以下功能:

var arrayContains = function(array, toMatch) {
    var arrayAsString = array.toString();
    return (arrayAsString.indexOf(','+toMatch+',') >-1);
}

“toString()”方法将始终使用逗号分隔值。仅适用于基本类型。