프로그래머스 중복된 숫자 개수 자바스크립트 | filter() | for...of, for...in

Chaeyeon Lee·2023년 5월 19일
0

🔅 1. 아이디어

filter를 배웠으니 filter를 써먹어봐야겠지요?
이 문제를 풀 당시에는 filter를 통해 n과 똑같은 item을 새로운 배열에 모으고, 해당 배열의 길이를 반환했다.

🧑‍💻 2. 내 코드

function solution(array, n) {
    let arr=array.filter(item=>item===n);
    return arr.length;
}

🐣 3. 개념

📌 Array.prototype.filter()

filter() 개념

function solution(array, n) {
    return array.filter(v=>v===n).length;
}

위 코드처럼 새로운 변수를 정의하지 않아도, filter는 조건에 맞는 새 배열을 반환하기 때문에 바로 return해줘도 된다.

다른 사람 풀이

다른 사람 풀이를 봤는데 이런 코드가 눈에 띄었다.

function solution(array, n) {
    var answer = 0;
    for(num of array) if(num === n) answer++;
    return answer;
}

📌 for...of

위 명령문은 반복가능한 객체(배열, 맵, 셋, String 등)에 대해 반복하고, 각 개별 속성값에 대해 실행되는 문이 있는 반복 후크를 호출하는 루프라고 한다.

설명만 읽었을 땐 무슨 말인지 잘 모르겠다....ㅎㅎ

const array1 = ['a', 'b', 'c'];

for (const element of array1) {
  console.log(element);
}

// Expected output: "a"
// Expected output: "b"
// Expected output: "c"

그니까, i 대신에 array1의 요소를 사용하는 거다.

for문에서 선언한 const element는 array1을 처음부터 끝까지 순회하며 각 원소를 가리킨다. 즉, 계속 다른 속성값을 할당 받게 됨.

of 뒤에는 반복되는 enumerable한 객체가 오게 된다.

let iterable = "boo";

for (let value of iterable) {
  console.log(value);
}
// "b"
// "o"
// "o"

위 예제처럼 String도 enumerable하기 때문에 반복가능하다.

//Map에 대해 반복
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);

for (let entry of iterable) {
  console.log(entry);
}
// [a, 1]
// [b, 2]
// [c, 3]

for (let [key, value] of iterable) {
  console.log(value);
}
// 1
// 2
// 3

//Set에 대해 반복
let iterable = new Set([1, 1, 2, 2, 3, 3]);

for (let value of iterable) {
  console.log(value);
}
// 1
// 2
// 3

📌 for...in

위 명령문은 for...of랑 비슷하다. 열거 가능한 non-Symbol 속성에 대해서 반복하다고 하는데...
인덱스의 순서가 중요한 Array에서 반복을 위해 사용할 수는 없다. 정수가 아닌 이름을 가진 속성들을 반환하기 때문이다.

const object = { a: 1, b: 2, c: 3 };

for (const property in object) {
  console.log(`${property}: ${object[property]}`);
}

// Expected output:
// "a: 1"
// "b: 2"
// "c: 3"

그럼 어따 쓰나? 이건 쉽게 객체의 속성을 확인할 수 있어서 디버깅을 위해 사용된다고 한다. 특히 키-값 쌍이 선호되는 데이터에 대해 특정 값을 가진 키가 있는지 확인하려는 경우 유용하다.
사실 지금은 쓸 일 없을 것 같아서 출처에 남겨두기로.
for...of 구문은 모든 객체보다는 컬렉션 전용이라고 생각하면 된다.
아래 코드는 for of 와 for in문의 차이를 보여준다.

Object.prototype.objCustom = function () {};
Array.prototype.arrCustom = function () {};

let iterable = [3, 5, 7];
iterable.foo = "hello";

for (let i in iterable) {
  console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}

for (let i of iterable) {
  console.log(i); // logs 3, 5, 7
}


출처
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for...of
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for...in

profile
프론트엔드 개발자 지망생

0개의 댓글