let fruits = ["apple", "banana", "cherry"];
const [first, second, thrid] = fruits;
first === fruits[0]
나머지를 보내고 싶다면?
const [first, ...rest] = fruits;
console.log(rest);
했을 때 처음을 제외하고 나머지만 분류할 수 있다.
단 항상 rest는 마지막에 위치하고 있어야 한다.
(배열로써 리턴해준다.)
배열과 객체의 다른 점은
객체의 경우는 순서가 중요하지 않다.
대신 key
의 값이 일치해야만 한다 반드시!
여기도 ...rest
가 있는데
마찬가지로 객체로써 return
을 해준다.
구조분해를 꼭 해야 하는가?
성능에 지장은 없으니 내가 편한 방법으로 상요하기
let person = {name:"Alice",eidueiduage:"22",city:"nework"};
let {name, eidueiduage : age} = person;
이런 아래의 방법으로 key명
을 바꿔줄 수도 있음.
const obj1 = {name : '강민', age: 30, city : 'seoul'};
const obj2 = {...obj1, address: "15-3939"};
console.log(obj2);
이렇게 객체를 복사를할 때 spread operator, ...
을 잘 쓸 때
객체나 배열 복사를 할 때 편리하게 복사를 할 수 있음.
그래서 그냥 {}
나 []
에 ...
이 있다면
아하 이걸 다 가져와서 복사해서 새롭게 사용하려 하는구나로 알아야 한다.
const obj2 = {...obj1, name : '호준'};
이렇게 사용하면 key
의 value
에 접근해서 value
값을 바꿔줄 수 있다.
이들은 새로운 주소로 할당을 받는거임
const obj2 = obj1
이런식으로가 안된다. => 배열도 마찬가지코드가 밑으로 쭉 내려갔을 때 디버깅이 힘들어짐
즉 빈 객체나 배열을 담아줘서
안전하게 진행해주면 된다
왜냐 이제는 브라우저가 성능이 많이 좋아져서
안정성에 더 집중하게 된 것이다.
push()
메서드
push
를 해서 메서드에 값을 넣어줄 수 있다.
animals.push('tiger','lion');
이렇게 한번에 넣어줄 수도 있음
animals.push(['tiger','lion']);
만약 이렇게 넣음면 어떻게 될까?
에러가 뜨지 않고 배열에 감싼 상태로 들어가니
push는 다 때려넣기 때문에 넣고 싶으면 그 내용만 넣으면 된다.
pop()
let numbers = [1,2,3,4,5,6];
numbers.pop();
마지막요소를 빼낸다 근데 이 pop
이 재밌는게
마지막요소를 빼낸 값을 본인이 가지고 있음.
console.log(numbers.pop());
이렇게 했을때 6과 [1,2,3,4,5] 가 같이 출력됨..
const number = numbers.pop();
그래서 빼낸 값을 변수로 지정할 수 있음!
shift()메서드는 pop()의 정반대
shift는 첫번째 요소를 빼난다
그냥 맨뒤에서 뽑는 메서드와 맨앞에서 뽑는 메서드가 있다고 기억하기
unshift() 는 맨 앞에다 추가하는 메서드
fruits.unshift('grape');
이고
fruits.unshift('grape','yeahe');
이렇게도 연결지어 가능하다.
sort() 메서드 문제
sort
는 기본 값을 가지고 있기 때문에 기본 값 만으로 정렬이 되긴 함
기본 정렬을 원한다면 sort()
만 사용해도 됨
sort((a,b) => a-b) // numbers.sort()
그러나 내림차순을 할 때는 (a,b) => b - a
근데 문자길이 만큼 나열한다면
words.sort((a,b) => a.length-b.length);
이런식으로 (a,b) => a.length-b.length
로 콜백해서
리턴을 시켜주는 작업 즉 콜백함수다.
students.sort(function(a, b) {
return a.age - b.age;
})
이게 콜백함수 버전의 sort
를 해체했을 때의 모습이다.
단순히 (a,b) => a.age - b.age
로 보기보다는
sort
가 화살표 함수버전으로 보여지니까 원본도 알고 있어야 한다.
만약 원본버전에서 return
이 없다면 값은 나오지 않는다.
콜백함수는 어떤 값을 return
하는지가 매우 중요하다.
sort는 일종의 반복이여서 알고리즘 때 반복으로 생각해야 함
concat
메서드 문제
let arr1 = [1,2];
let arr2 = [3,4];
console.log(arr1.concat(arr2));
let letters = ["A","B","C","D"];
console.log(letters.concat("E",["F","G"]));
이렇게 배열형태로 감싸도 다 벗겨져서 들어가게 된다.
let animals = ["Dog","Cat","Tiger","Elephant","Zebra"];
console.log(animals.slice(-3));
이렇게 했을 때 뒤에서 -3이라서
이렇게 인자를 하나만 두고도 사용할 수 있다.
정수 3을 사용하면 index넘버 3
부터 시작하고 알아서 끊는다.
배열을 하나로 합쳐서 다 문자열로 만드는 요소
let words = ["Hello","world","this","is","JavaScript"];
console.log(words.join("-"));
이런식으로 그냥 join하면 콤마까지 보여준다.
배열에 특정요소가 포함되어있는지 확인하는 메서드
그리고 확인하면 있으면 true
없으면 false
를 뱉는다.
const newNumbers = numbers.map((numbers)=>numbers*10);
풀어서 작성하면
numbers.map(function(number){
return number * 10
});
sort
와 마찬가지로 화살표 함수로 생략되어 있고
number
부분은 순회하는 값이다. 마찬가지로 return
을 내포하고 있다.
그리고 map
의 결국 return
뒤에 오는 값이 결국 배열에 return
된다.
왜냐면 map
에서 대문자처리나 소문자처리를 하게 될 경우
화살표 함수에서도 괄호를 치고{}
연산을 해야 한다.
그리고 중괄호를 치면 return
을 꼭 써줘야 한다.
중괄호 생략이 return
도 같이 생략인데 중괄호 쓴 순간 return
은 사용이 안된다.
let people = [
{name:'alice',age:25},
{name:'bob',age:30},
{name:'charlie',age:35}
];
people.forEach((p)=>{
console.log(p.name,p.age);
});
순회하면서 배열의 정보를 모두 보여줌
로직을 짤 때 결과값이 true
이면
그때 변경된 값을 배열에 새로 return
해준다
그래서
let ages = [12, 18, 20, 15, 30, 22];
ages.filter(function(age){
// age = 12
if (age > 18) {
return true;
}
})
이런식으로 조건이 성립할 때 true
를 리턴하면?
true
가 들어가는게 아닌 그 당시의 ages
의 값이
새로운 배열을 만들어낸다.
그래서 이런 값들을 변수에 할당도 가능하다.
let products = [
{name:'laptop',price:1200,category:'electronics'},
{name:'shoes',price:100,category:'clothing'},
{name:'smartphone',price:800,category:'electronics'},
{name:'lt-shirt',price:20,category:'clothing'},
];
// const newProducts = products.filter((p) => {
// if (p.category === 'electronics') {
// return true;
// }
// });
const newProducts = products.filter((p) => {
if (p.price >= 100){
return true;
}
})
console.log(newProducts);
return
을 하는 값을 요소에 추가되기 때문에
조건을 여러개 만들어도 됨
filter
안이 복잡해져도 상관이 없고, 원하는 로직을 구현하면 됨
products.filter((p) => {
if (p.price >= 100){
return true;
}
if (products.price < 30) {
return true;
}
}).forEach((product)=>{
console.log(product);
})
이런식으로도 붙일수는 있다 길어져도 가독성을 따라가면 좋다.
filter
와 map
에서 if
문 사용 차이filter
는 걸러진 값만 새로운 배열에 담지만 , map
에서 if
문은 정해진 값이 4개라면 4개를 다 담으려고 한다.