Kiểm tra xem một mảng có chứa bất kỳ phần tử nào của mảng khác trong JavaScript không


406

Tôi có một mảng mục tiêu ["apple","banana","orange"]và tôi muốn kiểm tra xem các mảng khác có chứa bất kỳ một trong các thành phần của mảng mục tiêu không.

Ví dụ:

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

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

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

Làm thế nào tôi có thể làm điều đó trong JavaScript?


3
Sử dụng một forvòng lặp và lặp qua mảng mục tiêu. Nếu mọi phần tử được chứa trong mảng hiện tại (sử dụng current.indexOf(elem) !== -1), thì tất cả chúng đều nằm trong đó.
Blender

21
@Alex chọn một câu trả lời anh chàng, thật thô lỗ khi bỏ chọn một câu trả lời, đặc biệt là với nhiều câu trả lời hay này. Tôi sẽ chọn dấu gạch dưới / lodash nếu tôi là bạn.
Leon Gaban

1
@LeonGaban Tôi không đồng ý. Tôi sẽ không nhập một thư viện chỉ để thực hiện thao tác này.
devpato

2
@devpato yeah đã thay đổi suy nghĩ của tôi, giải pháp ES6 là fav của tôi
Leon Gaban

Điều gì về Array1.some (el1 => Array2.includes (el1)); ?
Walaszka

Câu trả lời:


551

Vanilla JS

ES2016:

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

ES6:

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

Làm thế nào nó hoạt động

some(..)kiểm tra từng phần tử của mảng dựa vào hàm kiểm tra và trả về true nếu bất kỳ phần tử nào của mảng vượt qua hàm kiểm tra, nếu không, nó trả về false. indexOf(..) >= 0includes(..)cả hai đều trả về true nếu đối số đã cho có mặt trong mảng.


48
Mã này cần một lời giải thích - điều này có thể hoạt động, nhưng không có giá trị vì không ai học được gì
TolMera

6
Array.prototype.some () kiểm tra từng phần tử của mảng dựa vào hàm kiểm tra và trả về truenếu bất kỳ phần tử nào của mảng vượt qua hàm kiểm tra. Nếu không, nó trở lại false.
Hendeca

2
Đây phải là câu trả lời chính xác! Tuyệt vời khi sử dụng ES6
Nacho

1
Có phải dự kiến ​​rằng kết quả của tôi là [false, false, false]thay vì một mảng trống []?
Batman

@Batman: Kết quả là đúng / sai, nhưng bạn có thể điều chỉnh giải pháp từ ông skyisred
0zkr PM

230

vanilla 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;
    });
};

10
Giải pháp tốt đẹp! some()là rad. Thoát ngay khi một cái gì đó phù hợp.
averydev

6
sự kiện gọn gàng như thế này:arr.some(v=> haystack.indexOf(v) >= 0)
Paul Grimshaw

85
Cũng có sẵn trong ES2016arr.some(v => haystack.includes(v))
loganfsmyth

5
trong một dòng arr1.some(v => arr2.indexOf(v) >= 0).
webjay

1
Hiện tại, tốt nhất nên tránh sử dụng includes, vì rõ ràng nó không được hỗ trợ trong IE: stackoverflow.com/questions/36574351/ chủ
Shafique Jamal

72

Nếu bạn không phản đối việc sử dụng libray, http://underscorejs.org/ có một phương thức giao nhau, có thể đơn giản hóa việc này:

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]

Hàm giao nhau sẽ trả về một mảng mới với các mục mà nó khớp và nếu không khớp thì nó trả về mảng trống.


3
Tôi đã sử dụng điều này nhiều lần, nhưng lưu ý rằng câu hỏi là về việc kiểm tra xem có phần tử nào tồn tại trong mảng khác không, không tạo ra toàn bộ giao lộ. Về hiệu suất, có một sự khác biệt rất lớn nếu các mảng lớn vì trong trường hợp đầu tiên, bạn có thể bảo lãnh ngay khi bạn tìm thấy một trận đấu.
JHH

1
lodash dễ đọc hơn nhiều so với Javascript vanilla, libs như nó tại Ramda nên luôn được sử dụng thay vì vanilla imho. Tốt hơn cho tất cả các nhà phát triển ...
Leon Gaban

52

ES6 (nhanh nhất)

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));

Gạch dưới

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

DEMO: https://jsfiddle.net/r257wuv5/

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


1
đây là giải pháp đơn giản và khai báo nhất
strider

Tôi biết tôi thực sự trễ vì điều này, nhưng để kiểm tra bảng điều khiển nếu JSFiddle thêm JQuery Edge và bật Fireorms Lite
Rojo

Liên kết JSperf bị hỏng
DarckBlezzer

Có sự khác biệt về thời gian và không gian phức tạp? Điều gì sẽ là giải pháp tốt nhất liên quan đến sự phức tạp?
nacho

41

Nếu bạn không cần ép buộc kiểu (vì sử dụng indexOf), bạn có thể thử một cái gì đó như sau:

var arr = [1, 2, 3];
var check = [3, 4];

var found = false;
for (var i = 0; i < check.length; i++) {
    if (arr.indexOf(check[i]) > -1) {
        found = true;
        break;
    }
}
console.log(found);

Nơi arrchứa các mục tiêu. Cuối cùng, foundsẽ hiển thị nếu mảng thứ hai có ít nhất một trận đấu với mục tiêu.

Tất nhiên, bạn có thể trao đổi số cho bất cứ thứ gì bạn muốn sử dụng - chuỗi đều ổn, như ví dụ của bạn.

Và trong ví dụ cụ thể của tôi, kết quả sẽ là truedo mảng thứ hai 3tồn tại trong mục tiêu.


CẬP NHẬT:

Đây là cách tôi sắp xếp nó thành một chức năng (với một số thay đổi nhỏ so với trước):

var anyMatchInArray = (function () {
    "use strict";

    var targetArray, func;

    targetArray = ["apple", "banana", "orange"];
    func = function (checkerArray) {
        var found = false;
        for (var i = 0, j = checkerArray.length; !found && i < j; i++) {
            if (targetArray.indexOf(checkerArray[i]) > -1) {
                found = true;
            }
        }
        return found;
    };

    return func;
}());

DEMO: http://jsfiddle.net/u8Bzt/

Trong trường hợp này, hàm có thể được sửa đổi để targetArrayđược truyền vào dưới dạng đối số thay vì mã hóa cứng trong bao đóng.


CẬP NHẬT2:

Mặc dù giải pháp của tôi ở trên có thể hoạt động và (hy vọng nhiều hơn) có thể đọc được, tôi tin rằng cách "tốt hơn" để xử lý khái niệm tôi mô tả là làm một cái gì đó hơi khác một chút. "Vấn đề" với giải pháp trên là indexOfbên trong vòng lặp làm cho mảng đích bị lặp hoàn toàn cho mọi mục trong mảng khác. Điều này có thể dễ dàng được "sửa" bằng cách sử dụng "tra cứu" (bản đồ ... một đối tượng JavaScript theo nghĩa đen). Điều này cho phép hai vòng đơn giản, trên mỗi mảng. Đây là một ví dụ:

var anyMatchInArray = function (target, toMatch) {
    "use strict";

    var found, targetMap, i, j, cur;

    found = false;
    targetMap = {};

    // Put all values in the `target` array into a map, where
    //  the keys are the values from the array
    for (i = 0, j = target.length; i < j; i++) {
        cur = target[i];
        targetMap[cur] = true;
    }

    // Loop over all items in the `toMatch` array and see if any of
    //  their values are in the map from before
    for (i = 0, j = toMatch.length; !found && (i < j); i++) {
        cur = toMatch[i];
        found = !!targetMap[cur];
        // If found, `targetMap[cur]` will return true, otherwise it
        //  will return `undefined`...that's what the `!!` is for
    }

    return found;
};

DEMO: http://jsfiddle.net/5Lv9v/

Nhược điểm của giải pháp này là chỉ có thể sử dụng số và chuỗi (và booleans), bởi vì các giá trị được (ngầm) chuyển đổi thành chuỗi và được đặt làm khóa cho bản đồ tra cứu. Điều này không chính xác tốt / có thể / dễ dàng thực hiện cho các giá trị phi chữ.


2
Ví dụ Excelent, ví dụ thứ hai đơn giản là tuyệt vời.
Sorin Haidau

Tại sao bạn sử dụng cho các vòng lặp trong khi bạn có thể sử dụng một số hoặc find Index?
Là tôi ... Alex

1
"Một số" đơn giản hóa mã rất nhiều. Ngoài ra, anyMatchInArray ([1,2,3, "mèo", "4"], ["1", 4]) sẽ đúng. Cuối cùng, điều này có thể hiệu quả hơn NẾU bạn đã có một số lượng lớn các tra cứu và lưu vào bản đồ đích. Mặc dù vậy, có thể có hiệu suất tăng. Ví dụ: tôi đoán rằng "Found = toMatch [i]! == không xác định" sẽ hiệu quả hơn và trong một số trường hợp tốt hơn (để bạn không đánh giá "" hoặc 0 thành sai)
csga5000

"nếu không nó sẽ trở lại undefined... đó là những gì !!dành cho" - điều đó sai. Nó sẽ trả lại sự đối lập boolean của !.
AlienWebguy

41

Giải pháp ES6:

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

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

Không giống như nó: Phải chứa tất cả các giá trị.

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

Hy vọng, sẽ hữu ích.


Có cách nào để có được chỉ số của arra2 giá trị từ array1 ??
Anzil khaN

1
Trong trường hợp đó, chúng ta có thể sử dụng "bộ lọc" thay vì "một số". Sau đó, nó sẽ trả về một mảng thay vì boolean và bạn có thể dễ dàng truy cập giá trị từ đó.
tanvir993

29

Bạn có thể sử dụng lodash và làm:

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

Đặt giao cắt được thực hiện trên cả hai bộ sưu tập tạo ra một mảng các phần tử giống hệt nhau.


Nó không tối ưu về mặt hiệu suất, vì đối với vấn đề này, nó đủ để tìm trận đấu đầu tiên, trong khi intersectionsẽ tiếp tục so sánh ngay cả sau khi tìm trận đấu đầu tiên để tìm tất cả chúng. Nó giống như sử dụng filterkhi bạn cần find.
Alexander

29

Sử dụng bộ lọc / indexOf :

function containsAny(source,target)
{
    var result = source.filter(function(item){ return target.indexOf(item) > -1});   
    return (result.length > 0);  
}    


//results

var fruits = ["apple","banana","orange"];


console.log(containsAny(fruits,["apple","grape"]));

console.log(containsAny(fruits,["apple","banana","pineapple"]));

console.log(containsAny(fruits,["grape", "pineapple"]));


Điều này gặp phải vấn đề tương tự như các chức năng của thư viện như _.intersection ở chỗ nó sẽ tiếp tục tìm kiếm các kết quả khớp ngay cả sau khi tìm thấy một. Đối với mảng nhỏ rõ ràng nó không quan trọng mặc dù.
JHH

13
const areCommonElements = (arr1, arr2) => {
    const arr2Set = new Set(arr2);
    return arr1.some(el => arr2Set.has(el));
};

Hoặc thậm chí bạn có thể có hiệu suất tốt hơn nếu lần đầu tiên bạn tìm ra mảng nào trong hai mảng này dài hơn và tạo Setra mảng dài nhất, trong khi áp dụng somephương thức trên mảng ngắn nhất:

const areCommonElements = (arr1, arr2) => {
    const [shortArr, longArr] = (arr1.length < arr2.length) ? [arr1, arr2] : [arr2, arr1];
    const longArrSet = new Set(longArr);
    return shortArr.some(el => longArrSet.has(el));
};

3
Trong khi mọi người tiếp tục đăng các giải pháp với lồng nhau indexOfincludes, bạn là người đầu tiên trả lời với giải pháp dựa trên tập hiệu quả hơn, sử dụng nguồn gốc Set, 4 năm sau khi được đưa vào EcmaScript. +1
trincot

9

Tôi tìm thấy cú pháp ngắn và ngọt ngào này để khớp với tất cả hoặc một số phần tử giữa hai mảng. Ví dụ

// HOẶC thao tác. tìm nếu có bất kỳ phần tử mảng2 nào tồn tại trong mảng1. Điều này sẽ trở lại ngay khi có trận đấu đầu tiên khi một số phương thức bị phá vỡ khi hàm trả về TRUE

let array1 = ['a', 'b', 'c', 'd', 'e'], array2 = ['a', 'b'];

console.log(array2.some(ele => array1.includes(ele)));

// in TRUE

// VÀ hoạt động. tìm nếu tất cả các phần tử mảng2 tồn tại trong mảng1. Điều này sẽ trở lại ngay khi không có kết quả khớp đầu tiên vì một số phương thức bị phá vỡ khi hàm trả về TRUE

let array1 = ['a', 'b', 'c', 'd', 'e'], array2 = ['a', 'x'];

console.log(!array2.some(ele => !array1.includes(ele)));

// in SAI

Hy vọng rằng sẽ giúp được ai đó trong tương lai!


Tôi thực sự thích phần thứ hai của câu hỏi, để làm cho nó hoạt động cho ES5, đã làm như sau :! Mảng2.some (function (ele) {return Array1.indexOf (ele) === -1});
Friesgaard

6

Bạn có thể sử dụng lệnh gọi Array.prototype.some lồng nhau. Điều này có lợi ích là nó sẽ bảo lãnh tại trận đấu đầu tiên thay vì các giải pháp khác sẽ chạy qua vòng lặp lồng nhau đầy đủ.

ví dụ.

var arr = [1, 2, 3];
var match = [2, 4];

var hasMatch = arr.some(a => match.some(m => a === m));

4

Đây là một trường hợp thú vị tôi nghĩ tôi nên chia sẻ.

Giả sử bạn có một mảng các đối tượng và một loạt các bộ lọc được chọn.

let arr = [
  { id: 'x', tags: ['foo'] },
  { id: 'y', tags: ['foo', 'bar'] },
  { id: 'z', tags: ['baz'] }
];

const filters = ['foo'];

Để áp dụng các bộ lọc đã chọn cho cấu trúc này, chúng ta có thể

if (filters.length > 0)
  arr = arr.filter(obj =>
    obj.tags.some(tag => filters.includes(tag))
  );

// [
//   { id: 'x', tags: ['foo'] },
//   { id: 'y', tags: ['foo', 'bar'] }
// ]

4

Tôi đã viết 3 giải pháp. Chủ yếu họ làm như vậy. Họ trở về đúng ngay khi nhận được true. Tôi đã viết 3 giải pháp chỉ để hiển thị 3 cách khác nhau để làm việc. Bây giờ, nó phụ thuộc vào những gì bạn thích nhiều hơn. Bạn có thể sử dụng Performance.now () để kiểm tra hiệu suất của giải pháp này hay giải pháp khác. Trong các giải pháp của tôi, tôi cũng đang kiểm tra mảng nào là lớn nhất và mảng nào là nhỏ nhất để hoạt động hiệu quả hơn.

Giải pháp thứ 3 có thể không phải là dễ thương nhất nhưng hiệu quả. Tôi quyết định thêm nó bởi vì trong một số cuộc phỏng vấn mã hóa, bạn không được phép sử dụng các phương thức tích hợp.

Cuối cùng, chắc chắn ... chúng ta có thể đưa ra giải pháp với 2 NESTED cho các vòng lặp (cách thức vũ phu) nhưng bạn muốn tránh điều đó vì độ phức tạp thời gian là xấu O (n ^ 2) .

Ghi chú:

thay vì sử dụng .includes()như một số người khác đã làm, bạn có thể sử dụng .indexOf(). nếu bạn chỉ kiểm tra xem giá trị có lớn hơn 0. Nếu giá trị không tồn tại sẽ cho bạn -1. nếu nó tồn tại, nó sẽ cho bạn lớn hơn 0.

indexOf () vs bao gồm ()

Cái nào tốt hơn hiệu suất ? indexOf()cho một chút, nhưng bao gồm là dễ đọc hơn theo ý kiến ​​của tôi.

Nếu tôi không nhầm .includes()indexOf()sử dụng các vòng lặp phía sau hậu trường, thì bạn sẽ ở O (n ^ 2) khi sử dụng chúng .some().

Vòng lặp sử dụng

 const compareArraysWithIncludes = (arr1, arr2) => {
     const [smallArray, bigArray] =
        arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1];

     for (let i = 0; i < smallArray.length; i++) {
       return bigArray.includes(smallArray[i]);
     }

      return false;
    };

SỬ DỤNG .some ()

const compareArraysWithSome = (arr1, arr2) => {
  const [smallArray, bigArray] =
    arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1];
  return smallArray.some(c => bigArray.includes(c));
};

SỬ DỤNG MAPS Độ phức tạp thời gian O (2n) => O (n)

const compararArraysUsingObjs = (arr1, arr2) => {
  const map = {};

  const [smallArray, bigArray] =
    arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1];

  for (let i = 0; i < smallArray.length; i++) {
    if (!map[smallArray[i]]) {
      map[smallArray[i]] = true;
    }
  }

  for (let i = 0; i < bigArray.length; i++) {
    if (map[bigArray[i]]) {
      return true;
    }
  }

  return false;
};

Mã trong tôi: stackblitz

Tôi không phải là chuyên gia về hiệu suất cũng như BigO vì vậy nếu điều gì đó tôi nói là sai hãy cho tôi biết.


3

Còn việc sử dụng kết hợp một số / find Index và indexOf thì sao?

Vì vậy, một cái gì đó như thế này:

var array1 = ["apple","banana","orange"];
var array2 = ["grape", "pineapple"];

var found = array1.some(function(v) { return array2.indexOf(v) != -1; });

Để dễ đọc hơn, bạn có thể thêm chức năng này vào chính đối tượng Array.

Array.prototype.indexOfAny = function (array) {
    return this.findIndex(function(v) { return array.indexOf(v) != -1; });
}

Array.prototype.containsAny = function (array) {
    return this.indexOfAny(array) != -1;
}

Lưu ý: Nếu bạn muốn làm một cái gì đó với một vị từ, bạn có thể thay thế indexOf bên trong bằng một find Index khác và một vị từ


3

Giải pháp của tôi áp dụng các trình trợ giúp mảng Array.prototype.some ()Array.prototype.includes () làm công việc của họ khá hiệu quả.

ES6

const originalFruits = ["apple","banana","orange"];

const fruits1 = ["apple","banana","pineapple"];

const fruits2 = ["grape", "pineapple"];

const commonFruits = (myFruitsArr, otherFruitsArr) => {
  return myFruitsArr.some(fruit => otherFruitsArr.includes(fruit))
}
console.log(commonFruits(originalFruits, fruits1)) //returns true;
console.log(commonFruits(originalFruits, fruits2)) //returns false;


Có cách nào để lấy chỉ mục bao gồm các mục từ OriginalFruits không ??
Anzil khaN

3

Chỉ một giải pháp nữa

var a1 = [1, 2, 3, 4, 5]
var a2 = [2, 4]

Kiểm tra xem a1 có chứa tất cả phần tử của a2 không

var result = a1.filter(e => a2.indexOf(e) !== -1).length === a2.length
console.log(result)

2

Nó có thể được thực hiện bằng cách lặp lại qua mảng chính và kiểm tra xem mảng khác có chứa bất kỳ phần tử đích nào hay không.

Thử cái này:

function Check(A) {
    var myarr = ["apple", "banana", "orange"];
    var i, j;
    var totalmatches = 0;
    for (i = 0; i < myarr.length; i++) {
        for (j = 0; j < A.length; ++j) {
            if (myarr[i] == A[j]) {

                totalmatches++;

            }

        }
    }
    if (totalmatches > 0) {
        return true;
    } else {
        return false;
    }
}
var fruits1 = new Array("apple", "grape");
alert(Check(fruits1));

var fruits2 = new Array("apple", "banana", "pineapple");
alert(Check(fruits2));

var fruits3 = new Array("grape", "pineapple");
alert(Check(fruits3));

DEMO tại JSFIDDLE


2

Với dấu gạch dưới

var a1 = [1,2,3];
var a2 = [1,2];

_.every(a1, function(e){ return _.include(a2, e); } ); //=> false
_.every(a2, function(e){ return _.include(a1, e); } ); //=> true

2
Cá nhân, mặc dù tôi thích dấu gạch dưới, đây là một ví dụ cổ điển về cách mã phức tạp có thể trông như thế nào. Không chỉ khó hiểu là mã gạch dưới, mà từ quan điểm mã hóa chung, điều này cũng đúng (ví dụ: từ "every" không xuất hiện khi tôi muốn tìm chỉ mục của một thứ gì đó trong một mảng nhưng "IndexOf" không). Chúng ta nên tránh sử dụng các công cụ của bên thứ ba một cách không cần thiết khi có thêm một vài ký tự, một giải pháp JavaScript thuần túy có thể được cung cấp. Sử dụng dấu gạch dưới vì lợi ích của nó có nghĩa là giải pháp của bạn trở nên kết hợp chặt chẽ với mã của bên thứ ba.
csharpforevermore

@csharpforevermore Tôi cho rằng đây là vấn đề của hương vị, bạn nói giải pháp này phức tạp hơn tất cả những người khác sử dụng indexOftôi nghĩ ngược lại :). Mặt khác, tôi đồng ý trong việc cố gắng không thêm các thư viện bên ngoài nếu chúng không thực sự cần thiết, nhưng tôi không thực sự ám ảnh với điều đó, các thư viện phần ba không chỉ cung cấp các chức năng hữu ích mà còn cả các chức năng vững chắc . Ví dụ: Bạn đã thử nghiệm tất cả các cạnh trường và thị trưởng-trình duyệt với giải pháp của bạn .. (bằng cách này,? everyKhông đang cố gắng tìm một chỉ mục trong một danh sách nhưng đánh giá một cái gì đó trong mỗi phần tử trong danh sách)
fguillen

2

Thêm vào nguyên mẫu mảng

Tuyên bố từ chối trách nhiệm: Nhiều người sẽ khuyên mạnh mẽ chống lại điều này. Lần duy nhất nó thực sự là một vấn đề là nếu một thư viện thêm một hàm nguyên mẫu có cùng tên (hoạt động khác đi) hoặc đại loại như thế.

Mã số:

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

Không sử dụng các hàm mũi tên lớn:

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

Sử dụng

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

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

console.log(a.containsAny(["z"]))    // Outputs false

2

Vanilla JS với khớp một phần & không phân biệt chữ hoa chữ thường

Vấn đề với một số cách tiếp cận trước đó là chúng đòi hỏi phải khớp chính xác từng từ . Nhưng, nếu bạn muốn cung cấp kết quả cho một phần phù hợp thì sao?

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"]

Điều này hữu ích khi bạn muốn cung cấp hộp tìm kiếm nơi người dùng nhập từ và kết quả có thể có những từ đó theo bất kỳ thứ tự, vị trí và trường hợp nào.


2

Cập nhật câu trả lời includes@Paul Grimshaw, sử dụng ngay lập tức indexOfđể dễ đọc hơn

let Found = Array1.some (r => Array2.indexOf (r)> = 0)
let Found = Array1.some (r => Array2.includes (r))


1

Tôi đã đưa ra một giải pháp trong nút bằng cách sử dụng js gạch dưới như thế này:

var checkRole = _.intersection(['A','B'], ['A','B','C']);
if(!_.isEmpty(checkRole)) { 
     next();
}

0

Cá nhân, tôi sẽ sử dụng chức năng sau:

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

Phương thức "toString ()" sẽ luôn sử dụng dấu phẩy để phân tách các giá trị. Sẽ chỉ thực sự làm việc với các loại nguyên thủy.


2
Điều này sẽ không hoạt động khi các phần tử ở đầu hoặc cuối mảng hoặc theo thứ tự khác.
DanielM

1
-1 vì như DanielM đã nói điều này bị hỏng. Bạn có thể thêm và thêm dấu phẩy vào mảngAsString như một cách giải quyết, nhưng thành thực mà nói, nó có vẻ như là một giải pháp quá phức tạp để sử dụng chuỗi.
JHH

0

Mảng .filter () với lệnh gọi lồng vào .find () sẽ trả về tất cả các phần tử trong mảng đầu tiên là thành viên của mảng thứ hai. Kiểm tra độ dài của mảng được trả về để xác định xem có bất kỳ mảng thứ hai nào trong mảng thứ nhất không.

getCommonItems(firstArray, secondArray) {
  return firstArray.filter((firstArrayItem) => {
    return secondArray.find((secondArrayItem) => {
      return firstArrayItem === secondArrayItem;
    });
  });
}

Có cách nào để "dọn dẹp" mảng không? Giống như xóa các giá trị trong mảng thứ hai nếu chúng tồn tại trong đầu tiên?
Sandrooco

0
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);

0
var target = ["apple","banana","orange"];
var checkArray = ["apple","banana","pineapple"];

var containsOneCommonItem = target.some(x => checkArray.some(y => y === x));`

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

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

["grape", "pineapple"] //returns false;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.