체인의정석

javascript) 한 객체에 다수의 배열이 있을때 some 함수로 모두 검색하는 방법 (find vs indexOf vs some) 본문

개발/backend

javascript) 한 객체에 다수의 배열이 있을때 some 함수로 모두 검색하는 방법 (find vs indexOf vs some)

체인의정석 2023. 8. 7. 09:33
728x90
반응형

하나의 객체 안에 2개의 배열이 들어가 있는 상황이다.

const tokensArr = TOKENS.map(t => {
    const path = {};
    path.paths = t.paths;
    path.paths_v3 = t.paths_v3;
    path.tableName = t.tableName;
    path.address = t.address;
    return path
})

이런식으로 paths라는 배열과 paths_v3라는 배열이 있는데 두 배열을 모두 검색해서 내가 찾고자 하는 값이 양쪽 배열 중에 한쪽에 포함이 되어 있는지를 검토하는 함수를 짜고 싶었다.

평소에 자주 쓰던 filter가 생각나서 먼저 filter를 사용하려고 챗 gpt에게 물어보니 챗 gpt는 some 함수를 추천해주었다.

checkPools(poolAddress) {
    const hasPoolAddress = tokensArr.some(token => 
        token.paths.some(path => path === poolAddress) ||
        token.paths_v3.some(path_v3 => path_v3 === poolAddress)
    );

    console.log("Pool Address Found:", hasPoolAddress);
    return hasPoolAddress; // Returns true if poolAddress is found, otherwise false
}

보면 some 함수 안에 some 함수가 2개 있는데 이렇게 배열안의 한 요소안에 또 배열이 있고 그 배열 중 하나라도 값이 포함되어있는지 찾아서 bool 형태로 값을 도출하고 싶다면 위와 같이 사용하면 된다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/some

 

Array.prototype.some() - JavaScript | MDN

some() 메서드는 배열 안의 어떤 요소라도 주어진 판별 함수를 적어도 하나라도 통과하는지 테스트합니다. 만약 배열에서 주어진 함수가 true을 반환하면 true를 반환합니다. 그렇지 않으면 false를

developer.mozilla.org

const array = [1, 2, 3, 4, 5];

// Checks whether an element is even
const even = (element) => element % 2 === 0;

console.log(array.some(even));
// Expected output: true

기본 예제는 위와 같은데 만약 같은 값을 찾았다면 그 즉시 탐색을 멈추고 바로 true를 리턴하고 모든 요소를 다 검색해도 같은 값이 나오지 않았다면 false를 리턴하고 종료가 된다고 한다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/find

 

Array.prototype.find() - JavaScript | MDN

find() 메서드는 주어진 판별 함수를 만족하는 첫 번째 요소의 값을 반환합니다. 그런 요소가 없다면 undefined를 반환합니다.

developer.mozilla.org

기존에 많이 쓰던 것 중 find 나 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

 

Array.prototype.indexOf() - JavaScript | MDN

indexOf() 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환합니다.

developer.mozilla.org

indexOf 도 요소를 찾다가 찾으면 해당 값 또는 해당 값의 인덱스를 리턴해 주는 배열 검색 함수들이 있었는데

만약 bool 값을 리턴하고자 한다면 앞으로는 바로 some을 사용하면 될 것 같다.

 

3 함수의 속도가 궁금하여 지피티에게 물어보니

Both the some method and the indexOf or find methods are used to search for an element within an array. In terms of performance, the differences are typically negligible for small arrays. However, when comparing the three methods:

some(): This method will iterate over the array and return as soon as a match is found. It doesn't continue checking other elements once it finds a match.

indexOf(): This method is used primarily for arrays of primitive values (like numbers or strings). It returns the index of the first occurrence of a specified value, or -1 if the value is not found. It will also exit as soon as it finds the value.

find(): This method returns the value of the first element in the array that satisfies the provided testing function. Like some, it will also exit as soon as it finds a match.

For your specific use-case:

If you're checking arrays of primitive values (like strings), indexOf might be a bit faster than some or find but the difference would typically be negligible unless you're dealing with very large arrays.

If you're checking arrays of objects or need a more complex matching condition, you would use find or some since indexOf would not be applicable.

속도 자체는 indexOf 가 가장 빠르지만 큰 상관은 없고 검색 조건이 복잡하다면 some이나 find를 쓰라고 한다.

셋다 상관 없지만 인덱스를 리턴할지 값을 리턴할지 bool을 리턴할지에 따라서 다르게 사용하면 될것 같다.

728x90
반응형
Comments