나는 왜 배열을 어려워 하는가?

HeeChan·2020년 8월 17일
0

한주간

목록 보기
2/2

배열

인지 하자

문자 는 이상하게 새로 할당하지 않으면 값이 바뀌지 않는다. (read-only)

var str = 'abc';

str[0] = 'b'; //이렇게 값을 넣으면 'bbc' 로 바뀔 꺼라 생각 했지만 
//str 의 값은 바뀌지 않는다 그렇다고 에러가 나오지도 않는다. 
str // 'abc' ; 

str = 'bbb' ; 
str // 'bbb' ; 이렇게 새롭게 할당하면 값은 바뀐다. 

배열에 요소 가 포함 되어있는지 확인

let words =['abc','qwe','zxc']
words.indexOf('abc') // 0 배열에 'abc' 라는 요소가 있다면 그 요소의 인덱스를 준다.
words.indexOf('kkk'); // -1 존재 하지 않는다면 -1 을 준다. 

//이걸 이용해서 

words.indexOf('abc') !== -1  // true
words.indexOf('없지') !== -1 //false

근데 그냥 내장 메서드 includes 를 쓰자 IE 는 호환 안된다 이점 주의

forEach 를 이용하여 배열 안 객체 출력

let user = [ {name: 'hee',age:12},{name: 'kee',age:22},{name: 'aee',age:32},]

function output(user){
    console.log('Name:' + user.name);
}

user.forEach(output);
////////출력 ////////
2 Name:hee
2 Name:kee
2 Name:aee

map

let user = [ {name: 'hee',age:12},{name: 'kee',age:22},{name: 'aee',age:32},]

let uName = [];

function pushName(user){
    uName.push(user.name);
    }
user.forEach(pushName);

uName
//(3) ["hee", "kee", "aee"]

이렇게 기존에 있던걸 전혀 바꾸지 않고 새로운 배열을 만들 수 있다.

그런데 이걸 좀더 간단하게 map 메서드를 사용해보자

function getName(user){
	return user.name;
}

user.map(getName)
//(3) ["hee", "kee", "aee"]

map 으로 간단 하게 만들 수 이다.

filter

특정 조건만 추출 하기

let serach = [];
undefined
for(let i=0; i<user.length; i++){
	//20 이상인 것만 serach 에 담기  
    if(user[i].age > 20){
        serach.push(user[i])
    }
}
//2
serach
//(2) [{…}, {…}]

이걸 filter 메서드 를 사용해보자

function than20(user){
	return user.age > 20;
}

user.filter(than20);
// 이렇게 하면 위와 동일한 값이 출력된다. 

reduce

//배열을 문자열로
function joinName(result, uesr){
	return	result = result + user.name + ','
}

user.reduce(joinName,'') // , 뒤에 ''. 는 초기값

reduce 는 누적값 과 돌아가는 인자 가 있다.


실전 예제

단일 배열 만들기

let arr =[['hi',1],[123,4],[true,false]];
// 배열안의 배열들 을 단일 배열로 만들기 

const join = arr.reduce(function(a,c){
    return a.concat(c);
});

join
//(6) ["hi", 1, 123, 4, true, false]

배열 안 객체 안 배열의 값을 바꾸기

let studentList = [
  {
    name: 'Anna',
    gender: 'female',
    grades: [4.5, 3.5, 4],
  },
  {
    name: 'Dennis',
    gender: 'male',
    country: 'Germany',
    grades: [5, 1.5, 4],
  },
  {
    name: 'Martha',
    gender: 'female',
    grades: [5, 4, 4, 3],
  },
  {
    name: 'Brock',
    gender: 'male',
    grades: [4, 3, 2],
  },
];
studentReports(studentList)

function studentInfo(students) {
  // TODO: 여기에 코드를 작성합니다.
  //여학생 만 필터 적용 
 let fe = students.filter(function(el){
    return el.gender === 'female'
  }); // 여학생 정보 

    function grade(el){ // 학점 정보
      function gradesum(a,c){
          return a + c
      } return el.reduce(gradesum) / el.length; // 평점
    }

    function addfe(el){ //map 에서 불려질꺼라서 el 은 fe 의 정보 
        return el['grades'] = grade(el.grades); // fe 가 가지고 있는 녀석의 학점 에 평점을 덮어씌우는 함수
    } 
    fe.map(addfe);
    return fe;
  }

// [
//   { name: 'Anna', gender: 'female', grades: 4 },
//   { name: 'Martha', gender: 'female', grades: 4 },
// ];

profile
생각이란걸해

0개의 댓글