Arrray 내장 메서드

javascript에서 배열은

실제 배열이 아니고 배열의 동작을 흉내낸 특수한 객체이다. 실제로는 아래와 같이 숫자값을 key로 갖는 배열이다. 이 배열의 최대 길이는 232 -1 이므로 너무 긴 배열의 경우 주의하도록 하자

객체이므로 자바스크립트로 강제로 중간값을 없애는 empty를 만들 수 있는데 웬만하면 이런 특징을 사용하지 않도록 한다.

실제 JS 배열 내부의 모습

console.log(Object.getOwnPropertyDescriptor([1,2,3]));
/*
{
  '0':{value:1, writable:true, enumerable: true, configurable: true},
  '1':{value:2, writable:true, enumerable: true, configurable: true},
  '2':{value:3, writable:true, enumerable: true, configurable: true},
  length:{value:3, writable:true, enumerable: false, configurable: false},
}
*/

JS 메서드 사용시 주의점

빠르게 만들어진 언어다보니 원본 객체의 보장을 하지 않는 메서드들이 일부 있다. 따라서 JS를 쓸때는 2가지를 중점적으로 봐야한다. 1.원본배열의 변화유무, 2.반환값 #추가작성필요

mutator method : 원본배열 변경메서드 splice, push

accessor method : 새 배열 생성메서드 concat,

// 배열의 생성
const list = (new Array(10)).fill(0); 
/* new Array(1,2,3) = [1,2,3]
   Array.of(1) => [1]
   Array.from({length} ,(_ , i) => i)  => [0, 1, 2]
*/

// list는 object객체임.
typeof list  // retun 'object' 

//length
list.length // 배열의 길이


// isArray
Array.isArray(list) // true

// indexOf , inclueds
[1,2,3,4].indexOf(2, _) // 1 _는 시작위치
[1,2,3,4].includes(3) // true


[2,23,4].push('test')  /// return list.length =4 

[2,23,4].pop()  // return 2

[2,23,4].unshift('test','te')  /// return list.length =5

[2,23,4].shift()  /// return list.length =2

[1,2,3].concat([4,5,6],7)  // [1,2,3,4,5,6,7]  , 될수있으면 spread쓸것

// join
['가','나','다'].join(":")  // return "가나다"


// fill *원본배열변경*
[1,2,3,4,5].fill(0)  // [0,0,0,0,0]


// splice *원본배열변경*
const originArr = [1,2,3,4,5]
const targetItem = originArr.splice(1,1) //return [2], originArr = [1,3,4,5]
// 하나만 제거시 요소를 indexOf로 특정하고 splice로 제거
// filter는 전체 요소 제거

// slice
const originArr = [1,2,3,4,5]
const targetItem = originArr.slice(1,1) //return [2], originArr = [1,2,3,4,5]
const reverseItem = originArr.slice(-1) //return [5], originArr = [1,2,3,4,5]

// flat
[1,[2,3,[4,[5]]]].flat(2)  // return [1,2,3,4,[5]] , dept에 따라서 깊이, default는 1

// sort *원본배역*
[2,8,1,5].sort((a,b)=> a-b) // return undefined , originArr =[1,2,5,8]

// find
const targetItem = list.find((item)=>{return item.id == targetId})   // return Item


// findIndex
const targetItem = list.findIndex((item)=>{return item.id == targetId})   // return index as number


// some
const targetItem = list.some((item)=>{return item.id == targetId})  // return boolean


// every
const targetItem = list.every((item)=>{return item.id == targetId})  // return boolean

// filter
const targetItem = list.filter((item)=>{return item.id == targetId})  // return Item[]
const usefullFilter = list.filter((val, i, self)=>self.indexOf(val)===i); // 일반적인 중복제거 방법이지만 객체의 요소를 비교해서 중복을 제거해야할 때 사용하면 좋다

// map
const targetItem = list.map((item)=>{return {...item, value:item.value+1}})  // return Item[]


// flatMap  = map().flat(1) 과 동일
list.map((item)=>item.split('')).flat();



// reduce
const targetItem = list.reduce((acc,cur)=>(acc+cur), 0)  // return 최종값
const usefullReduce = list.reduce((arr, cur)=>{
    acc[cur] = (acc[cur]|| 0) + 1
    return arr
}, {}) // 최종적으로 list에 있는 요소들의 숫자를 {key:value} 형태로 가지고 있음



// forEach는 리턴값이 없고 map은 리턴배열을 받음
const forEachResult = list.forEach((item)=>{ return item}) // undefined
const mapResult = list.map((item)=>{ return item}) // [1,2,3]