STUDY/[ JavaScript ]

이차원배열 Array.from() arr.fill()

Lim임 2025. 9. 22. 01:21

Array.from()

반환값 [ 배열 ]

 

Array.from(arrayLIke, [mapFn] ,[thisArg])

arrayLike = 배열로 변환할 *유사배열객체 반복가능한 객체

mapFn = 모든 요소를 호출할 *맵핑 함수

thisArg = mapFn실행 시 this로 사용할 값

 

 

예)

Array.from({ length: 3 }, () => Array(4).fill(0));

[3][4] = [0,0,0],[0,0,0],[0,0,0],[0,0,0]

 

*유사배열객체란?

// 이것들은 모두 유사 배열 객체입니다
const arrayLike1 = { length: 3 };
const arrayLike2 = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
const arrayLike3 = { length: 5, 0: 'first', 4: 'last' };

 

Array.from()과 사용하면 이러함

Array.from(arrayLike1): [undefined, undefined, undefined]
Array.from(arrayLike2): ['a', 'b', 'c']
Array.from(arrayLike3): ['first', undefined, undefined, undefined, 'last']

 

아하~ key값은 index구나

그래서 length: 는 전체크기를 가리키고

 

 

{length:3}이 어떻게 동작하는가?

const obj = { length: 3 };

// Array.from()은 이 객체를 다음과 같이 해석합니다:
// "length가 3이니까, 3개 요소를 가진 배열을 만들어야겠다"
// "0, 1, 2 인덱스의 값을 확인해보자"

console.log(obj[0]); // undefined (없으니까)
console.log(obj[1]); // undefined 
console.log(obj[2]); // undefined

// 결과적으로 [undefined, undefined, undefined] 배열이 생성됩니다
const result = Array.from(obj);
console.log(result); // [undefined, undefined, undefined

 

---

mapFn()

function mapFn(element, index, array) {
  // element: 현재 요소의 값
  // index: 현재 요소의 인덱스
  // array: 현재 배열
  return 변환된값; // 새 배열에 들어갈 값
}

 

아하 그니까

mapFn까지는 일차원배열임

그 배열의 요소를 가지고 멀 할꺼냐 이건데

이제 그 요소에 .Array(4).fill()로 넣는거임 이차원배열을!

 

---

fill()

반환값 원본배열

arr.fill(value, start, end)
  • value: 배열을 채울 값 (필수)
  • start: 시작 인덱스 (선택사항, 기본값: 0)
  • end: 끝 인덱스 (선택사항, 기본값: 배열 길이, 이 인덱스는 포함되지 않음)

 

 

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

function solution(n) {
    return Array(n).fill().map((_, i) => Array(n).fill().map(($, j) => i === j ? 1 : 0));
}

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

내가 원했던 코드는 이거시다,,, 

 

단위 행렬을 만드는 코드란다

 

Array(n).fill()
// n개의 undefined로 채워진 배열 생성

 

for문 대신 _,i 로 인덱스를 가져온다

.map((_, i) => ...)
// 각 행(row)을 처리하는 부분
// _: 현재 요소 (undefined, 사용하지 않음)
// i: 현재 행 인덱스 (0, 1, 2, ...)

 

Array(n).fill().map(($, j) => i === j ? 1 : 0)
// 각 열(column)을 처리하는 부분
// $: 현재 요소 (undefined, 사용하지 않음)  
// j: 현재 열 인덱스 (0, 1, 2, ...)
// i === j ? 1 : 0: 대각선이면 1, 아니면 0

근데 얘는 왜 $ 이거 쓰는거지

 

= 중첩레벨에 따라 다르게 쓴다고 한다~

둘 다 '사용하지 않는다'는 의미는 같지만

변수명에 차이를 둔다고 생각하면 됨!!

 

// 레벨 1: _
// 레벨 2: $  
// 레벨 3: __ (만약 있다면)

 

싹 다 _언더스코어로 해도 상관은 없으나

가독성이 뒤지잔어

 

i === j ? 1 : 0
// i: 행 번호
// j: 열 번호  
// 행 번호와 열 번호가 같으면 대각선 → 1
// 다르면 → 0

 

---

 

내가 가독성 좋게 써봄

 

solution=(n)=>{
    let arr1,arr2 =Array(n).fill();
    arr1.map((_,i)=>{
        arr2.map(($,j)=>{
            i===j?1:0;
        })
    })
    return arr1
}

 

안됨!!!!!! 이유는 이러함!

 

 let arr1,arr2 =Array(n).fill();

이 문법이 안됨!!

이렇게 쓰면 arr1은 undefined 상태가 됨

 

원래 되지 않았나?????흥~~~

 

안된다네요 나 머랑 헷갈렸냐

 

그리고~ map 이 새로운 배열을 뱉어내는건데

그걸 받아낼 return 이나 변수가 업섯슴~~~~ 엣쿙

내가 자꾸 헷갈리는 이유는

 

한 줄로 쓰면 리턴할 필요가 없음!!!

그래서 내가 자꾸 리턴이 있는지 없는지 헷갈리는거임!!!!!

 

solution = (n) => {
    let arr1 = Array(n).fill(),
    arr2 = Array(n).fill(); // arr1 arr2 배열 초기화
    return arr1.map((_, i) => {
        return arr2.map(($, j) => {
        	return i === j ? 1 : 0;
        });
    });
};

 

정말,,어렵꾼,,

앞으로는 한 줄로 쓰는 것도,, 풀어서 가독성 좋게 쓰는 것도 해봐야겠씀

---

나선형 수업

 

핵심은 다음값이 undefined가 아니면 상태변환 flag를 변경한다

solution = (n)=>{
    let arr1 = Array(n).fill(),arr2=Array(n).fill();
    return arr1.map((c,i)=>{
        return arr2.map(($,j)=>{
            return j++;
            console.log(j);
        })
    })
}

일단 못한 코드 

map으로 접근하는게 아닌거가틈