๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JavaScript

[JavaScript] ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ํ•จ์ˆ˜

by soy๋ฏธ๋‹ˆ 2021. 9. 29.

 

 

 

 

๋ฆฌ์ŠคํŠธ

let ar = [
    {
        n:'ํ˜ธ๋ž‘์ด',
        a: 10,
    },
    {
        n:'์ฝ”๋ผ๋ฆฌ',
        a: 20,
    },
    {
        n:'๋…์ˆ˜๋ฆฌ',
        a: 30,
    }
]

console.log(1);
console.log(ar);
console.log(2);

for(const v of ar){
    console.log(v);
}

// { n: 'ํ˜ธ๋ž‘์ด', a: 10 }
// { n: '์ฝ”๋ผ๋ฆฌ', a: 20 }
// { n: '๋…์ˆ˜๋ฆฌ', a: 30 }

console.log(3);
console.log(ar);
console.log(4);

 

 

typeof

let ar = [80, 20, 10, 15];
console.log(ar, typeof(ar));

let br = ar.toString();
console.log(br, typeof(br));

let st01 = '80,20,10,15';
console.log(st01, typeof(st01));

// [ 80, 20, 10, 15 ] object
// 80,20,10,15 string
// 80,20,10,15 string

 

  • ๋ณ€์ˆ˜ ํƒ€์ž… ํ™•์ธ

 

 

push & pop

let ar = [80, 20, 10, 15]

// pop()*  // ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋˜๋Š” ํ•จ์ˆ˜๋ผ๋Š” ์˜๋ฏธ
let num = ar.pop();
console.log(ar, num);    // [80, 20, 10] 15

// push()*
num = ar.push(20);
console.log(ar, num);    // [80, 20, 10, 20] 4   // size

 

  • ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ์ด ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€์˜ ์—ฌ๋ถ€๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.
  • push : ๋ฐฐ์—ด์˜ ๋งจ ๋’ค์— ๊ฐ’ ์ถ”๊ฐ€
  • pop : ๋ฐฐ์—ด์˜ ๋งจ ๋์˜ ๊ฐ’ ์ œ๊ฑฐ

 

shift & unshift

// shift
let ar = [10, 20, 30]
// shift()*                            // ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
console.log(ar.shift());               // 10
console.log(ar);                       // [20, 30]
console.log(ar.unshift(40));           // 3
console.log(ar);                       // [40, 20, 30]
console.log(ar.unshift(50, 60 ,70));   // 6
console.log(ar);                       // [50, 60, 70, 40, 20, 30]

 

  • shift : ๋ฐฐ์—ด์˜ ๋งจ ์•ž์— ๊ฐ’ ์ถ”๊ฐ€
  • unshift : ๋ฐฐ์—ด์˜ ๋งจ ์•ž์˜ ๊ฐ’ ์ œ๊ฑฐ

 

concat

// concat
let ar = [80, 20, 10, 15]
let br = ar.concat(40);
console.log(ar);               // [80, 20, 10, 15]
console.log(br);               // [80, 20, 10, 15, 40]
 
let cr = [40, 50, 60];
let dr = ar.concat(cr);
console.log(dr);               // [80, 20, 10, 15, 40, 50, 60]

 

  • ๋ฐฐ์—ด์— ์ƒˆ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์„ ์—ฐ๊ฒฐ์‹œ์ผœ์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜

 

join

// join
let ar = ['tiger', 'lion', 'cat'];
console.log(ar.join());
console.log(ar.join(''));
console.log(ar.join(' + '));

// tiger,lion,cat
// tigerlioncat
// tiger + lion + cat

 

  • ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋“ค์„ ์—ฐ๊ฒฐ

 

 

sort

// sort
let ar = [52, 273, 103, 32];
function func(a, b) {
    // return (a > b) ? +1 : -1;
    return a - b;
}
ar.sort(func);
console.log(ar);      // [ 32, 52, 103, 273 ]


let ar = [
    {n:30, a:'์‚ผ์„ฑ'},
    {n:20, a:'๋กฏ๋ฐ'},
    {n:10, a:'ํ˜„๋Œ€'},
];
function func1(a, b) {
    return a.n - b.n;
}
function func2(a, b) {
    let c = a / 10 + a % 10;
    let d = b / 10 + b % 10;
    return c - d;
}
ar.sort(func1);
console.log(ar);     // [ { n: 10, a: 'ํ˜„๋Œ€' }, { n: 20, a: '๋กฏ๋ฐ' }, { n: 30, a: '์‚ผ์„ฑ' } ]
ar.sort(func2);
console.log(ar);     // [ { n: 30, a: '์‚ผ์„ฑ' }, { n: 20, a: '๋กฏ๋ฐ' }, { n: 10, a: 'ํ˜„๋Œ€' } ]

 

  • sort : ๋ฐฐ์—ด ์ •๋ ฌ

 

slice

// slice *                    // ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
let ar = [10, 20, 30, 40, 50, 60];
// s <= x < e
let br = ar.slice(2, 4); 
console.log(br);              // [30, 40]

 

  • slice : ๋ฐฐ์—ด ์ž๋ฅด๊ธฐ
  • dictionary ๋˜๋Š” ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค. (์–•์€ ๋ณต์‚ฌ)

 

 

splice

// splice
let ar = [1,2,3];
// [์‹œ์ž‘ ์œ„์น˜, ์‚ญ์ œ ํ•ญ๋ชฉ ์ˆ˜, ์ถ”๊ฐ€ ํ•ญ๋ชฉ ...]
ar.splice(1, 0, 10, 20, 30);
console.log(ar);             // [ 1, 10, 20, 30, 2, 3 ]
ar.splice(1, 2, 88, 99);
console.log(ar);             // [ 1, 88, 99, 30, 2, 3 ]
let br = [66, 55, 44, 33];
ar.splice(0, 0, br);
console.log(ar);             // [ [ 66, 55, 44, 33 ], 1, 88, 99, 30, 2, 3 ]

 

  • splice : ์‚ญ์ œํ•  ์š”์†Œ ๊ฐœ์ˆ˜ ๋ฐ ์ถ”๊ฐ€ํ•  ์š”์†Œ๋ฅผ ๋ฐ›์•„์„œ ์›๋ณธ ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ˆ˜์ • ๋ฐ ์—ฐ๊ฒฐ

 

indexOf

// indexOf
let ar = ['tiger', 'cat', 'tiger', 'lion', 'apple'];
console.log(ar.indexOf('lion'));         // 3
console.log(ar.indexOf('dog'));          // -1
console.log(ar.indexOf('lion', 3));      // 3
console.log(ar.indexOf('cat', 10));      // -1
console.log(ar.indexOf('tiger'));        // 0
console.log(ar.lastIndexOf('tiger'));    // 2

 

  • indexOf : ๋ฐฐ์—ด ์š”์†Œ ์ฐพ๊ธฐ(๊ฒ€์ƒ‰)

 

every

// every
let ar = [1, 2, 10, 39, 20]
let br = [1, 2, 10, 50, 20]
function func(value) {
    return value < 40;
}
console.log(ar.every(func));             // true
console.log(br.every( v => v < 40));     // false
// ๊ฐ„์†Œํ™” ํ•˜๊ธฐ ์ „
// console.log(br.every(
//     (v) => { return v < 40; }
// ));

 

  • every : ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€(true / false) ๊ฒ€์‚ฌ

 

some

// some
let ar = [1, 5, 11, 39, 21];
console.log(ar.some(v => v % 2 ==0));  // false

 

  • some : ๋ฐฐ์—ด์˜ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋งŒ ์กฐ๊ฑด์„ ํ†ต๊ณผํ•˜๋ฉด true

 

filter

// filter
let ar = [1, 6, 11, 39, 21];
let br = ar.filter( v => v < 15 );
console.log(br);      // [ 1, 6, 11 ]

 

  • filter : ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๊ณ  ๊ทธ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐฐ์—ด ์š”์†Œ๋งŒ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜

 

reduce

// reduce
// ํ˜•ํƒœ : array.reduce((๋ˆ„์ ๊ฐ’, ํ˜„์žฟ๊ฐ’, ์ธ๋ฑ์Šค, ์š”์†Œ) => { return ๊ฒฐ๊ณผ }, ์ดˆ๊นƒ๊ฐ’);


// sum (๋ง์…ˆ)
var initialValue = 0;
var sum = [{x: 1}, {x: 2}, {x: 3}].reduce(
    (accumulator, currentValue) => accumulator + currentValue.x, initialValue
); 
console.log(sum);         // 6
 
// concat
var flattened = [[0,1],[2,3],[4,5]].reduce(
    (accumulator, currentValue) => accumulator.concat(currentValue),
    []
);
console.log(flattened);   // [ 0, 1, 2, 3, 4, 5 ]

// ๊ฐ์ฒด ๋‚ด ์ธ์Šคํ„ด์Šค ๊ฐ’์˜ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function (allNames, name){
    if(name in allNames){
        allNames[name]++;
    }
    else{
        allNames[name] = 1;
    }
    console.log(allNames);
    return allNames;
}, {});
console.log(countedNames); // { Alice: 2, Bob: 1, Tiff: 1, Bruce: 1 }

 

  • ์ดˆ๊ธฐ๊ฐ’์„ ์ ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค ๊ฐ’์ด ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •
  •  sort, every, some, find ๋“ฑ๋„ reduce๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

์†์„ฑ์œผ๋กœ ๊ฐ์ฒด ๋ถ„๋ฅ˜ํ•˜๊ธฐ

// ์†์„ฑ์œผ๋กœ ๊ฐ์ฒด ๋ถ„๋ฅ˜ํ•˜๊ธฐ
var people = [
    { name: 'Alice', age: 21 },
    { name: 'Max', age: 20 },
    { name: 'Jane', age: 20 }
];

function groupBy(objectArray, property){
    return objectArray.reduce(function (acc, obj){
        var key = obj[property];
        if(!acc[key]){
            acc[key]=[];
        }
        console.log(acc[key]);
        acc[key].push(obj);
        return acc;
    }, {});
}
var groupedPeople = groupBy(people, 'age');
console.log(groupedPeople);

// []   -> 21 ์ฒ˜์Œ ๋“ค์–ด์˜ด
// []   -> 20 ์ฒ˜์Œ ๋“ค์–ด์˜ด
// [ { name: 'Max', age: 20 } ]   -> 20 ์ฐพ์Œ
// {'20': [ { name: 'Max', age: 20 }, { name: 'Jane', age: 20 } ],
//  '21': [ { name: 'Alice', age: 21 } ]}

 

  • objectArray  = list ๋กœ, ์—ฌ๊ธฐ์„œ๋Š” people ๋ฆฌ์ŠคํŠธ์ด๋‹ค.
  • property = key ๋กœ, ์—ฌ๊ธฐ์„œ๋Š” people ๋ฆฌ์ŠคํŠธ์˜ age ์ด๋‹ค.
  • acc ๋Š” ๋ˆ„์  ๋ฆฌ์ŠคํŠธ์ด๊ณ  obj ๋Š” ํ˜„์žฌ index์˜ ์š”์†Œ์ด๋ฏ€๋กœ key(= obj[property]) ๋Š” ๊ฐ index ์˜ age ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ๋ฑ์Šค๋ณ„๋กœ ํ•˜๋‚˜์”ฉ ์ ‘๊ทผํ•  ๋•Œ ๋ˆ„์  ๋ฆฌ์ŠคํŠธ์— ํ˜„์žฌ ์ธ๋ฑ์Šค์˜ age ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฐ’์ด ์—†์œผ๋ฉด [] ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  push ํ•œ๋‹ค.

 

 

์Šคํ”„๋ ˆ๋“œ ํ™•์žฅ ์—ฐ์‚ฐ์ž์™€ ์ดˆ๊ธฐ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์— ๋‹ด๊ธด ๋ฐฐ์—ด์„ ์—ฐ๊ฒฐํ•˜๊ธฐ

// ์Šคํ”„๋ ˆ๋“œ ํ™•์žฅ ์—ฐ์‚ฐ์ž์™€ ์ดˆ๊ธฐ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์— ๋‹ด๊ธด ๋ฐฐ์—ด์„ ์—ฐ๊ฒฐํ•˜๊ธฐ
var friends = [{
    name: 'Anna',
    books: ['Bible', 'Harry Potter'],
    age: 21
},{
    name: 'Bob',
    books: ['War and peace', 'Romeo and Juliet'],
    age: 26
},{
    name: 'Alice',
    books: ['The Lord of the Rings', 'The Shining'],
    age: 18
}];

var allbooks = friends.reduce(function(accumulator, currentValue){
    return [...accumulator, ...currentValue.books];
}, ['Alphabet']);

console.log(allbooks);


//[
//  'Alphabet',
//  'Bible',
//  'Harry Potter',
//  'War and peace',
//  'Romeo and Juliet',
//  'The Lord of the Rings',
//  'The Shining'
//]

 

  • ...currentValue.books : friends ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ ์ธ๋ฑ์Šค์˜ books ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„ ์š”์†Œ๋กœ ๊ฐ€์ ธ์™€์„œ ๋‹ค ๋”ํ•˜์—ฌ allbooks ์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

* ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž

// Spread ์—ฐ์‚ฐ์ž
const ar = [1, 2, 3, 4, 5];
console.log(ar);              // [ 1, 2, 3, 4, 5 ]
console.log(...ar);           // 1, 2, 3, 4, 5
  • ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋Š” ๋ฐฐ์—ด ์š”์†Œ๊ฐ€ ๊ฐœ๋ณ„์ ์ธ ์š”์†Œ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

 

๋ฐฐ์—ด์˜ ์ค‘๋ณต ์ œ๊ฑฐ

// ๋ฐฐ์—ด์˜ ์ค‘๋ณต ์ œ๊ฑฐ
let ar = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
let result = ar.sort().reduce((accumulator, current) => {
    const length = accumulator.length;
    console.log("accumulator: " + accumulator);
    console.log("current: " + current);
    console.log("length: " + length);
    if (length === 0 || accumulator[length - 1] !== current) {
        accumulator.push(current);
    }
    return accumulator;
}, []);
console.log(result); // [ 1, 2, 3, 4, 5 ]

 

  • ๋ˆ„์  ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๊ฐ€ 0 (=์ฒซ ์ž…๋ ฅ) ์ด๊ฑฐ๋‚˜ ํ˜„์žฌ index์˜ ์š”์†Œ๊ฐ’๊ณผ ๊ทธ ์ „ ์š”์†Œ ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด push ํ•˜๊ณ , ๊ฐ™์œผ๋ฉด ์ค‘๋ณต์ด๋ฏ€๋กœ push ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • sort() ํ•จ์ˆ˜๋กœ ar ๋ฐฐ์—ด์ด ์ด๋ฏธ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

// map ์˜ˆ์ œ
let result = total.reduce((acc, cur) => {
    acc.push(cur % 2 ? 'ํ™€์ˆ˜':'์ง์ˆ˜');
    return acc;
}, []);
console.log(result);    // [ 'ํ™€์ˆ˜', '์ง์ˆ˜', 'ํ™€์ˆ˜' ]

 

  • reduce ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ดˆ๊ธฐ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ณ  push ํ•˜๋ฉด map ๊ณผ ๊ฐ™์•„์ง„๋‹ค.

 

// filter ์˜ˆ์ œ
let total = [1, 2, 3];
let result = total.reduce((acc, cur) => {
    if(cur % 2 !== 0) { acc.push(cur); }
    return acc;
}, []);
console.log(result);    // [ 1, 3 ]

 

  • reduce ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์กฐ๊ฑด๋ถ€๋กœ push ํ•˜๋ฉด filter ์™€ ๊ฐ™์•„์ง„๋‹ค.

 

 

์˜ˆ์ œ

๊ฐ์ฒด ๋ฐฐ์—ด ์ค‘ property ๊ฐ’์œผ๋กœ ๋‚˜์ด max, min ๊ตฌํ•˜๊ธฐ

// age ์ตœ๋Œ€, ์ตœ์†Œ๊ฐ’ ๊ตฌํ•˜๊ธฐ
var people = [
    { name: 'Alice', age: 25 },
    { name: 'Max', age: 23 },
    { name: 'Jane', age: 21 },
];

var max = people.reduce(
    (max, current) => {
        return current.age >= max.age ? current : max;
    }, people[0]
)

var min = people.reduce(
    (min, current) => {
        return current.age < min.age ? current : min;
    }, people[0]
)
console.log("max: ", max); // max:  { name: 'Alice', age: 25 }
console.log("min: ", min); // min:  { name: 'Jane', age: 21 }

 

  • people์˜ age ๊ฐ’ ์ตœ๋Œ€ ์ตœ์†Œ ๊ตฌํ•˜๊ธฐ
  • min, max ๊ตฌํ•˜๋Š” ๊ณต์‹์€ ์–ด๋ ต์ง€ ์•Š์€๋ฐ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •์ด ์ค‘์š”ํ•˜๋‹ค.
  • ์ดˆ๊ธฐ๊ฐ’์„ 0 ์œผ๋กœ ์žก์•„์ค„ ๊ฒฝ์šฐ min ์˜ ๊ฒฝ์šฐ์— return 0 ์ด ๋˜์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๊ฐ’ ๋น„๊ต๋ฅผ ํ•  ๋•Œ 0 ์ด ์•„๋‹Œ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋„๋ก ์ดˆ๊ธฐ๊ฐ’์„ people[0] ์œผ๋กœ ์žก์•„์ฃผ๊ณ  people[0].age ๋กœ ๊บผ๋‚ด ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

 

 

 

 

์ฐธ๊ณ  : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

 

Array.prototype.reduce() - JavaScript | MDN

reduce() ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ๋ฆฌ๋“€์„œ(reducer) ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

developer.mozilla.org

 

 

 

 

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

๋Œ“๊ธ€