객체 코플릿 오답노트
객체의 키값으로 객체전체를 할당하고 싶었다. 하지만 obj1[property] = obj2[property]라고 쓰게 된다면, obj2의 객체의 전체 속성값을 가져오는 것이 아닌 부분 키의 값만 할당하는 것이기 때문에, obj1[property] = obj2; 라고 쓰는 것이 바람직 하다.
틀린코드
function removeNumberValues(obj) {
for(let key in obj){
if(typeof(key) === 'number'){
delete obj[key];
}else{
continue;
}
}
}
: 위의 for문 안의 if문에서 typeof(key)는 key라는 데이터타입을 계산하는 코드가 되어버리기 때문에, typeof(obj[key])로 바꿔줘야한다.
작동하는 코드
function removeNumberValues(obj) {
for(let key in obj){
if(typeof(obj[key]) === 'number'){
delete obj[key];
}else{
continue;
}
}
}
For ... of 구문과 Object.entries()메소드를 사용하여 작동하는 코드
function removeNumberValues(obj) {
for(const [key, value] of Object.entries(obj)){
if(typeof(value) === 'number'){
delete obj[key];
}
}
}
: for..of 문은 보통 배열에서 많이 쓰인다..?라고 알고있다. 하지만 entries 메소드를 mdn에 검색해보면 ...
const object1 = {
a: 'somestring',
b: 42
};
for (const [key, value] of Object.entries(object1)) {
console.log(`${key}: ${value}`);
}
// expected output:
// "a: somestring"
// "b: 42"
// order is not guaranteed
이렇게 쓰인다는 것을 볼 수 있다. 즉 스프레드(펴주는)로 객체를 저렇게 key와 value을 같이 출력할 수 있도록 도와주나보다. 그래서 앞의 키의 값이 숫자타입인지 아닌지를 확인하는 조건문이 있었는데, typeof(obj[key]) 대신 키의 값을 바로 키값과 같이
받아왔으므로 typeof(value)로 숫자타입인지 아닌지를 확인해주었다.
틀린코드 :
function select(arr, obj) {
let objTemp = {};
for(let key of arr){
for(let property in obj){
if(key === property){
objTemp = obj[property];
}
}
}
return objTemp;
}
여기서 객체를 리턴해야하는데 되지 않은 이유가 있다 정답은 if문 안에 objTemp = obj[property]; 이 코드 때문인데, 저렇게 할당을 해버리면 obj 키의 값만 할당이 되고, 아무리 빈 객체로 선언을 하더라고 일반 변수의 값이 들어가므로 변수로 되어 객체로 리턴할 수 가 없게된다. 그래서 작동되는 코드는 다음과 같다.
작동되는 코드
function select(arr, obj) {
let objTemp = {};
for(let key of arr){
for(let property in obj){
if(key === property){
objTemp[property] = obj[property];
}
}
}
return objTemp;
}
objTemp[property] = obj[property];
이 코드가 objTemp에 property가 가지고있는 값과 같은 키를 만들면서, obj[property]의 값을 objTemp[property]로 할당해준다는 말과 같다.
function getLastElementOfProperty(obj, property) {
let maybeArr = obj[property];
if(Array.isArray(obj[property])){
return maybeArr.slice(-1)[0];
}
}
: return maybeArr.slice(-1)[0]; 에서 [0]을 왜 붙여줬냐면 slice(-1)라는 뜻은 맨뒤의 인덱스의 값을 가진다는 뜻이다. 해서 맨뒤의 인덱스의 값만 가지므로 배열의 요소가 하나다. 그래서 [0]로 배열의 요소를 출력한다. 만약 [0]가 없이 리턴했다면
[4] 즉 배열자체가 리턴되므로 배열의 요소를 리턴하라는 문제의 조건과 맞지않다.
똑같은 문제 작동되는 다른 코드
function getLastElementOfProperty(obj, property) {
if(Array.isArray(obj[property])){
let maybeArr = obj[property];
return maybeArr[maybeArr.length - 1];
}
}
: 이코드는 slice(-1)로 맨뒤의 인덱스의 값을 가지는 것이아닌 그저 배열의 총 길이를 구한다음 거기에 -1을 해서 맨뒤의 인덱스가 무엇인지 구한다음 그 배열의 요소를 그대로 리턴한 방식이다.
틀린코드
function getValueOfNthElement(arr, num) {
// 빈배열을 입력받은 경우 'no name'을 리턴
if(arr.length === 0){
return 'no name';
}
// 배열의 범위를 벗어나는 인덱스를 입력받은 경우, 마지막 객체의 'name' 속성값을 리턴해야 합니다.
if(num > arr.length){
return arr[arr.length - 1]['name'];
}
if(num < arr.length){
return arr[num]['name'];
}
}
작동되는 코드
function getValueOfNthElement(arr, num) {
// 빈배열을 입력받은 경우 'no name'을 리턴
if(arr.length === 0){
return 'no name';
}
// 배열의 범위를 벗어나는 인덱스를 입력받은 경우, 마지막 객체의 'name' 속성값을 리턴해야 합니다.
if(num >= arr.length){
return arr[arr.length - 1]['name'];
}
if(num < arr.length){
return arr[num]['name'];
}
}
function getAllButLastElementOfProperty(obj, key) {
let objTemp = {};
for(let prop in obj){
objTemp[prop] = obj[prop];
}
if(Array.isArray(obj[key])){
return objTemp[key].slice(0,objTemp[key].length - 1);
}else{
return [];
}
}
: 입력받은 객체를 수정하지 말아야해서 처음 빈객체를 선언하고, 그 빈객체에 파라미터로 받은 객체를 할당하고, 만약 파라미터로 받은 객체의 키를 파라미터로 받은 key에 대입해서 값을 봤을때 배열이면, 빈객체에 파라미터로 받은 객체를 할당당한 그 객체에 마지막요소를 빼고 리턴하는 방식이다. 그외에의 것들은 빈배열을 반환했다.
function extend(obj1, obj2) {
for(let key in obj2){
if(!(key in obj1)){
obj1[key] = obj2[key];
}
}
}
: 만약 obj1에 obj2에 있는 키가 없으면 obj2에 있는 키와 키의 값을 obj1에 할당해주는 코드이다.
function mostFrequentCharacter(str){
let obj = {mostcount: 0, mostname: ''};
for(let i = 0; i < str.length; i++){
if(str[i] === ' '){
continue;
}
if(obj[str[i]] === undefined){
obj[str[i]] = 0;
}
obj[str[i]] = obj[str[i]] + 1;
if(obj[str[i]] > obj['mostcount']){
obj['mostcount'] = obj[str[i]];
obj['mostname'] = str[i];
}
}
return obj['mostname'];
}