javascript map array 글을 간단하게 번역했다.
// 기본
const originalArray = [1, 2, 3, 4, 5];
const newArray = originalArray.map(
function addOne(number) {
return number + 1;
}
);
console.log(originalArray); // [1, 2, 3, 4, 5]
console.log(newArray); // [2, 3, 4, 5, 6]
// 익명함수를 사용해도 된다
const originalArray = [1, 2, 3, 4, 5];
const newArray = originalArray.map(
function (number) {
return number + 1;
}
);
console.log(originalArray); // [1, 2, 3, 4, 5]
console.log(newArray); // [2, 3, 4, 5, 6]
// callback 함수를 standalone 함수로 생성해서 변수로 선언하고 싶을 때는 다음과 같이 한다
// standalone 함수란 1) 클래스에 속하지 않고 2) global namespace 에 있는 함수
const originalArray = [1, 2, 3, 4, 5];
function addOne(number) {
return number + 1;
}
const newArray = originalArray.map(addOne);
console.log(originalArray); // [1, 2, 3, 4, 5]
console.log(newArray); // [2, 3, 4, 5, 6]
map 메서드 말고도 for 문을 사용해서 위와 동일한 결과를 낼 수 있는데 map 메서드를 꼭 사용해야할까? 그렇다. 그 이유는 map 메서드(를 포함한 여러 내장 함수들)를 사용하면 코딩 양이 줄 뿐만 아니라, 코드의 가독성을 높일 수 있기 때문이다.
뿐만 아니라 map 메서드는 기존 배열을 유지하기 때문에 코드를 이해하기 쉽다.
배열의 map 메서드에서 콜백함수는 arrow function 으로 사용하면 좋다. 코드가 간결해지기 때문이다.
다만, 콜백함수로 arrow function 을 쓸 경우, 콜백함수의 함수명을 지정해줄 순 없다. (arrow function 은 익명함수만 사용 가능하기 때문)
// function 키워드로 map 메서드 사용
// const originalArray = [1, 2, 3, 4, 5];
// const newArray = originalArray.map(
// function addOne(number) {
// return number + 1;
// }
// );
// console.log(originalArray);
// console.log(newArray);
// 콜백함수를 arrow function 으로 쓸 때
const originalArray = [1, 2, 3, 4, 5];
const newArray = originalArray.map((number) => number + 1);
console.log(originalArray);
console.log(newArray);
array.map((value, index, array) => {...});
: 배열을 돌고 난 뒤에 변환된 새로운 배열을 리턴하는 map 메서드와 달리
forEach 는 아무 값도 리턴하지 않는다.
다음은 map 대신에 forEach 를 쓰면 더 좋은 예제다.
const myArray = [1, 2, 3, 4];
// use map
myArray.map(number => {
console.log(number);
});
// use forEach
myArray.forEach(number => {
console.log(number);
});
map 을 사용하면 1, 2, 3, 4 와 [ undefined, undefined, undefined, undefined ] 값이 리턴된다.
forEach 를 사용하면 1, 2, 3, 4 값만 출력된다. 리턴되는 값은 없다.
다음은 forEach 대신에 map 을 쓰면 더 좋은 예제다.
const originalArray = [1, 2, 3, 4];
const newArray = [];
// use forEach
originalArray.forEach((number, i) => {
newArray[i] = number * 2;
});
console.log(newArray); // [2, 4, 6, 8]
// use forEach
const originalArray = [1, 2, 3, 4];
const newArray = originalArray.map((number) => number * 2);
console.log(newArray); // [2, 4, 6, 8]
const originalArray = [1, 2, undefined, 3];
const newArray = originalArray
.filter(value => {
return Number.isInteger(value);
}).map(value => {
return value * 2;
});
console.log(newArray); // [2, 4, 6]
// 배열을 또 다른 배열로 반환할 때
const originalArray = [1, 2, 3, 4, 5];
const newArray = originalArray.reduce((accumulator, value, index) => {
accumulator[index] = value * 2;
return accumulator;
}, []);
console.log(newArray); // [2, 4, 6, 8, 10]
// 다른 형태의 데이터 타입으로 반환할 때
const myArray = ['a', 'b', 'c', 'd'];
const myObject = myArray.reduce((accumulator, value) => {
accumulator[value] = true;
}, {});
console.log(myObject); // { a: true, b: true, c: true, d: true }
// Don't do this!
const originalArray = [1, 2, 3, 4, 5];
const reverseNewArray = originalArray.reverse().map(number => number * 2);
console.log(originalArray); // [5, 4, 3, 2, 1]
console.log(reverseNewArray); // [10, 8, 6, 4, 2]
// Instead, do this!
const originalArray = [1, 2, 3, 4, 5];
const reverseNewArray = originalArray.map(number => number * 2).reverse();
console.log(originalArray); // [1, 2, 3, 4, 5]
console.log(reverseNewArray); // [10, 8, 6, 4, 2]
const originalArray = [1, 2, 3, 4, 5]
const newArray = originalArray.slice().reverse()
console.log(newArray) // [5, 4, 3, 2, 1]
const originalArray = [
{ a: 1, b: 'first' },
{ a: 2, b: 'second' },
{ a: 3, b: 'third' },
];
const newArray = originalArray.map(object => object.b);
console.log(newArray); // ['first', 'second', 'third']
const object = {
a: 1,
b: 2,
c: 3,
};
const array = Object.entries(object);
const object = {
a: 1,
b: 2,
c: 3,
};
const array = Object.entries(object);
console.log(array); // [['a', 1], ['b', 2], ['c', 3]]
const newArray = array.map(([key, value]) => [key, value * 2]);
console.log(newArray); // [['a', 2], ['b', 4], ['c', 6]]
const newObject = newArray.reduce((accumulator, [key, value]) => {
accumulator[key] = value;
return accumulator;
}, {});
console.log(newObject);
const object = {
a: 1,
b: 2,
c: 3,
};
const entries = Object.entries(object);
const newObject = entries.reduce((accumulator, [key, value]) => {
accumulator[key] = value * 2;
return accumulator;
}, {});
// also works using forEach and mutating an object
const newObject = {};
entries.forEach(([key, value]) => {
newObject[key] = value * 2;
});
console.log(newObject); // { a: 2, b: 4, c: 6 }
const originalArray = [5, 10, 15, 20];
const newArray = originalArray.map(number => {
if (number >= 10) {
return number * 2;
}
return number;
});
console.log(newArray); // [5, 20, 30, 40]
const originalArray = [5, 10, 15, 20];
const newArray = originalArray.map(number =>
number >= 10 ? number * 2 : number,
);
console.log(newArray); // [5, 20, 30, 40]
const originalArray = [5, 10, 15, 20];
const newArray = originalArray.map(number =>
number === 10 ? number * 2 : number,
);
console.log(newArray); // [5, 20, 15, 20]
const myArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
const newArray = myArray.map(value => value.map(number => number * 2));
console.log(newArray); // [[2, 4, 6], [8, 10, 12], [14, 16, 18]]
// originalArray could either be [1, 2, 3, 4] or null
const newArray = (originalArray || []).map(number => number * 2);
const originalArray = [5, 10, 15, 20];
// Before
const newArray = originalArray.map(value => value * 2);
// Using curly braces
const newArray = originalArray.map(value => {
console.log(value);
return value * 2;
});
// Using javascript logic
const newArray = originalArray.map(value => console.log(value) || value * 2);