检查一个数组是否包含 JavaScript 中另一个数组的任何元素

IT技术 javascript arrays
2021-02-04 14:49:21

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

例如:

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

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

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

我如何在 JavaScript 中做到这一点?

6个回答

香草JS

ES2016:

const found = arr1.some(r=> arr2.includes(r))

ES6:

const found = arr1.some(r=> arr2.indexOf(r) >= 0)

怎么运行的

some(..)根据测试函数检查数组的每个元素,如果数组的任何元素通过测试函数,则返回 true,否则返回 false。如果给定的参数存在于数组中indexOf(..) >= 0,则includes(..)两者都返回 true。

是否预期我的结果[false, false, false]不是空数组[]
2021-03-11 14:49:21
@CarloFontanos 有人还在使用 IE 吗?
2021-03-17 14:49:21
我怎样才能得到那个数字的值?
2021-03-22 14:49:21
必须这样做才能过滤掉一个巨大的 csv 来寻找一些东西。我曾经.filter()得到一个适用于手头任务的行的列表,该some()方法派上了用场。谢谢你。 var searchTerms = ['term1', 'term2', 'term3', 'term4']; var results = csvRows.filter(row => searchTerms.some(value => row.column1.includes(value)));
2021-03-24 14:49:21
@Batman:结果为真/假,但你可以改编skyisred先生的解决方案
2021-04-04 14:49:21

香草js

/**
 * @description determine if an array contains one or more items from another array.
 * @param {array} haystack the array to search.
 * @param {array} arr the array providing items to check for in the haystack.
 * @return {boolean} true|false if haystack contains at least one item from arr.
 */
var findOne = function (haystack, arr) {
    return arr.some(function (v) {
        return haystack.indexOf(v) >= 0;
    });
};

正如@loganfsmyth 所指出的,您可以在 ES2016 中将其缩短为

/**
 * @description determine if an array contains one or more items from another array.
 * @param {array} haystack the array to search.
 * @param {array} arr the array providing items to check for in the haystack.
 * @return {boolean} true|false if haystack contains at least one item from arr.
 */
const findOne = (haystack, arr) => {
    return arr.some(v => haystack.includes(v));
};

或简单地作为 arr.some(v => haystack.includes(v));

如果要确定数组是否包含另一个数组中的所有项目,请替换some()every() 或作为arr.every(v => haystack.includes(v));

在 ES2016 中也可用 arr.some(v => haystack.includes(v))
2021-03-13 14:49:21
在一行中arr1.some(v => arr2.indexOf(v) >= 0)
2021-03-13 14:49:21
不错的解决方案! some()是 rad。只要有匹配项就退出。
2021-03-14 14:49:21
像这样的事件整理器: arr.some(v=> haystack.indexOf(v) >= 0)
2021-03-16 14:49:21
目前,最好避免使用includes,因为 IE 显然不支持它:stackoverflow.com/questions/36574351/...
2021-03-28 14:49:21

ES6解决方案:

let arr1 = [1, 2, 3];
let arr2 = [2, 3];

let isFounded = arr1.some( ai => arr2.includes(ai) );

与它不同的是:必须包含所有值。

let allFounded = arr2.every( ai => arr1.includes(ai) );

希望,会有所帮助。

有没有办法array1 中获取arra2值的索引
2021-03-27 14:49:21
在这种情况下,我们可以使用“过滤器”而不是“一些”。然后它将返回一个数组而不是布尔值,您可以从那里轻松访问值。
2021-03-27 14:49:21
就我而言,它仅在我从函数内部返回时才有效,例如: let allFounded = arr2.every( ai => return arr1.includes(ai) );
2021-04-03 14:49:21

如果你不反对使用 libray,http ://underscorejs.org/有一个交集方法,它可以简化这个:

var _ = require('underscore');

var target = [ 'apple', 'orange', 'banana'];
var fruit2 = [ 'apple', 'orange', 'mango'];
var fruit3 = [ 'mango', 'lemon', 'pineapple'];
var fruit4 = [ 'orange', 'lemon', 'grapes'];

console.log(_.intersection(target, fruit2)); //returns [apple, orange]
console.log(_.intersection(target, fruit3)); //returns []
console.log(_.intersection(target, fruit4)); //returns [orange]

交叉函数将返回一个新数组,其中包含匹配的项目,如果不匹配,则返回空数组。

我已经多次使用它,但请注意,问题是关于检查另一个数组中是否存在任何元素,而不是生成整个交集。在性能方面,如果数组很大,则存在巨大差异,因为在第一种情况下,您可以在找到匹配项后立即退出。
2021-03-30 14:49:21
lodash 比 vanilla Javascript 更具可读性,应该始终使用 Ramda 中类似的库,而不是 vanilla imho。更适合所有开发人员...
2021-03-30 14:49:21

ES6(最快)

const a = ['a', 'b', 'c'];
const b = ['c', 'a', 'd'];
a.some(v=> b.indexOf(v) !== -1)

ES2016

const a = ['a', 'b', 'c'];
const b = ['c', 'a', 'd'];
a.some(v => b.includes(v));

下划线

const a = ['a', 'b', 'c'];
const b = ['c', 'a', 'd'];
_.intersection(a, b)

演示:https : //jsfiddle.net/r257wuv5/

jsPerf:https ://jsperf.com/array-contains-any-element-of-another-array

JSperf 链接损坏
2021-03-14 14:49:21
时间复杂度和空间复杂度有区别吗?关于复杂性的最佳解决方案是什么?
2021-03-15 14:49:21
我知道我真的迟到了,但是要检查控制台是否 JSFiddle 添加 JQuery Edge 并打开 Firebug Lite
2021-03-29 14:49:21