[javascript] 배열에 JavaScript의 다른 배열 요소가 포함되어 있는지 확인

대상 배열 ["apple","banana","orange"]이 있고 다른 배열에 대상 배열 요소 중 하나가 포함되어 있는지 확인하고 싶습니다.

예를 들면 다음과 같습니다.

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

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

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

JavaScript로 어떻게 할 수 있습니까?



답변

바닐라 JS

ES2016 :

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

ES6 :

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

작동 원리

some(..)배열의 각 요소를 테스트 함수와 비교하여 검사하고 배열의 요소가 테스트 함수를 통과하면 true를, 그렇지 않으면 false를 반환합니다. indexOf(..) >= 0includes(..)주어진 인수는 어레이에있는 경우 모두 true를 반환.


답변

바닐라 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;
    });
};


답변

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]

교차 함수는 일치하는 항목이 포함 된 새 배열을 반환하고 일치하지 않으면 빈 배열을 반환합니다.


답변

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


답변

유형 강제 변환이 필요하지 않은 경우 (의 사용으로 인해 indexOf) 다음과 같이 시도 할 수 있습니다.

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

어디 arr대상 항목이 포함되어 있습니다. 마지막으로 found두 번째 배열이 대상과 일치하는 항목이 하나 이상 있는지 표시합니다 .

물론, 당신이 사용하고 싶은 것으로 숫자를 바꿀 수 있습니다-예와 같이 문자열은 좋습니다.

그리고 특정 예에서 결과는 true두 번째 배열 3이 대상에 존재 하기 때문 입니다.


최신 정보:

다음은 기능을 구성하는 방법입니다 (이전과 약간의 변경 사항이 있음).

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

데모 : http://jsfiddle.net/u8Bzt/

이 경우 targetArray클로저에서 하드 코딩되는 대신 인수로 전달 되도록 함수를 수정할 수 있습니다 .


UPDATE2 :

위의 솔루션이 효과가 있고 읽을 수 있지만 (더 나은) 읽을 수는 있지만 설명 된 개념을 처리하는 “더 나은”방법은 약간 다르게 행동하는 것입니다. 위의 솔루션의 “문제” indexOf는 루프 내부에서 다른 어레이의 모든 항목에 대해 대상 어레이가 완전히 반복되도록하는 것입니다. 이것은 “조회”(맵 … JavaScript 객체 리터럴)를 사용하여 쉽게 “고정”될 수 있습니다. 이를 통해 각 배열에 대해 두 개의 간단한 루프가 가능합니다. 예를 들면 다음과 같습니다.

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

데모 : http://jsfiddle.net/5Lv9v/

이 솔루션의 단점은 값이 (암시 적으로) 문자열로 변환되고 조회 맵의 키로 설정되기 때문에 숫자와 문자열 (및 부울) 만 (올바르게) 사용할 수 있다는 것입니다. 이것은 리터럴이 아닌 값에 대해 정확하거나 적합하지 않거나 쉽게 수행되지 않습니다.


답변

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

희망이 도움이 될 것입니다.


답변

lodash를 사용하여 다음 을 수행 할 수 있습니다 .

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

동일한 요소의 배열을 생성하는 두 컬렉션에서 교차 설정이 수행됩니다.