Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 배열에서 고유하면서 가장 긴 문자열 값 찾기

다음과 같은 객체 배열이 있다고 가정해 보겠습니다.

예시

const arr = [
    {text:'use'},
    {text: 'secur'},
    {text: 'form'},
    {text: 'user'},
    {text: 'users'},
    {text: 'form'},
    {text: 'secur'},
    {text: 'sec'},
    {text: 'users'},
    {text: 'secu'},
    {text: 'secur'},
    {text: 'for'},
    {text: 'form'}
]

우리가 작성해야 할 함수는 이 배열과 숫자 n을 인자로 받아, text 키의 문자열 길이가 가장 긴 객체 n개로 구성된 배열을 반환하는 함수입니다. 단, 반환되는 모든 객체의 text 값은 서로 중복되지 않는 고유한 값이어야 합니다. 만약 고유한 객체가 n개보다 적게 존재한다면, 존재하는 모든 고유 객체를 반환하면 됩니다.

그럼 이 함수의 코드를 직접 작성해 보겠습니다.

예시

const arr = [
    {text: 'use'},
    {text: 'secur'},
    {text: 'form'},
    {text: 'user'},
    {text: 'users'},
    {text: 'form'},
    {text: 'secur'},
    {text: 'sec'},
    {text: 'users'},
    {text: 'secu'},
    {text: 'secur'},
    {text: 'for'},
    {text: 'form'}
];
const sorter = (a, b) => {
    return b.text.length - a.text.length;
}
const longestUnique = (arr, num) => {
    const copy = arr.slice();
    copy.sort(sorter);
    const map = new Map();
    const uniqueCopy = copy.filter(el => {
        const exists = map.get(el.text);
        if(exists){
            return false;
        };
        map.set(el.text, 1);
        return true;
    });
    return uniqueCopy.splice(0, num);
}
console.log(longestUnique(arr, 4));
console.log(longestUnique(arr, 12));

코드 설명

이 함수의 동작 과정은 다음과 같이 세 단계로 나눌 수 있습니다.

1. 내림차순 정렬: 원본 배열을 변경하지 않도록 slice()로 복사본을 만든 뒤, sorter 비교 함수를 사용해 text 문자열 길이가 긴 순서대로 정렬합니다.

2. 중복 제거: Map 객체를 활용해 이미 등장한 text 값인지 확인하고, 처음 등장하는 값만 남겨 고유한 요소들로 이루어진 새로운 배열을 만듭니다.

3. 결과 잘라내기: splice(0, num)을 사용해 정렬된 고유 배열에서 앞에서부터 n개의 요소만 잘라내어 반환합니다. 고유한 객체의 개수가 n개보다 적다면, 자동으로 전체 고유 객체가 반환됩니다.

출력

콘솔에 출력되는 결과는 다음과 같습니다.

[
    { text: 'secur' },
    { text: 'users' },
    { text: 'form' },
    { text: 'user' }
]
[
    { text: 'secur' },
    { text: 'users' },
    { text: 'form' },
    { text: 'user' },
    { text: 'secu' },
    { text: 'use' },
    { text: 'sec' },
    { text: 'for' }
]