๐Ÿ“… TIL #28

์–ธ๋”๋ฐ” part2


๐Ÿ‘‰ sort ๊ตฌํ˜„

  • ๋ฌธ์ œ ์„ค๋ช…
  1. _.sortBy๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ํ•จ์ˆ˜ transform์„ ์ ์šฉํ•˜์—ฌ ์–ป์€ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  2. transform์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์˜ ์š”์†Œ ๊ฐ’ ์ž์ฒด์— ๋Œ€ํ•œ ๋น„๊ต ์—ฐ์‚ฐ์ž์˜ ๊ฒฐ๊ณผ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  3. ์˜ˆ๋ฅผ ๋“ค์–ด, number ํƒ€์ž…๊ฐ„ ๋น„๊ต๋Š” ๋Œ€์†Œ ๋น„๊ต์ด๊ณ  string ํƒ€์ž…๊ฐ„ ๋น„๊ต๋Š” ์‚ฌ์ „์‹(lexical) ๋น„๊ต์ž…๋‹ˆ๋‹ค.
  4. ์„ธ ๋ฒˆ์งธ ์ธ์ž์ธ order๋Š” ์ •๋ ฌ์˜ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ƒ๋žต๋˜๊ฑฐ๋‚˜ 1์„ ์ž…๋ ฅ๋ฐ›์€ ๊ฒฝ์šฐ ์˜ค๋ฆ„์ฐจ์ˆœ, -1์„ ์ž…๋ ฅ๋ฐ›์€ ๊ฒฝ์šฐ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  • ํžŒํŠธ
  1. Array.prototype.sort๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. _.identity๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ „๋‹ฌ ์ธ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜)


์ด ๋ฌธ์ œ๋Š” ํ•จ์ˆ˜ transform์ด ์ฃผ์–ด์ง€๋ฉด ํ•จ์ˆ˜์— ๋งž๊ฒŒ ์ •๋ ฌ์„ ํ•˜๋Š” sortBy๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์‹ค์ œ ๋ฉ”์†Œ๋“œ sort๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŽธํ–ˆ์œผ๋ฉฐ ์ด๋ฅผ ์ž˜ ํ™œ์šฉํ•ด์„œ ์‹ค์ œ sort ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

๋‚˜์˜ ์ฝ”๋“œ๋จผ์ € ์‚ดํŽด๋ณด์ž!


_.sortBy = function (arr, transform, order) {
  //์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋ณต์‚ฌํ•ด์˜จ๋‹ค.
  let newArr = _.slice(arr);
  order = order || 1;
  transform = transform || _.identity;

  return newArr.sort(function (a, b) {
    if (order > 0) {
      // ์˜ค๋ฆ„ ์ฐจ์ˆœ
      return transform(a) < transform(b) ? -1 : 0;
    } else {
      // ๋‚ด๋ฆผ ์ฐจ์ˆœ
      return transform(a) > transform(b) ? -1 : 0;
    }
  });
  return newArr;
};



๋‚˜๋Š” ์ด๋Ÿฐ์‹์œผ๋กœ ์–ธ๋”๋ฐ” sortBy๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ •๋ง ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์ด ๋‚˜์˜จ ๊ฒƒ ๊ฐ™๋‹ค.

์ˆ˜๋„์ฝ”๋“œ๋Š” ๊ฐ„๋‹จํžˆ ์š”์•ฝํ•˜์ž๋ฉด.

1.transform์ด๋ผ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์™€ ์—†์„ ๊ฒฝ์šฐ๋กœ ๋จผ์ € ๋‚˜๋ˆ ์ค˜์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

=> ๋‘๋ฒˆ์งธ ์ธ์ž๊ฐ’์— transform์ด undefined๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ ์šฉ๋  ๊ฒƒ์ด๊ณ , undefined์ด๊ฑฐ๋‚˜ _.identity๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ _.identity(๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜)๊ฐ€ ์ ์šฉ ๋  ๊ฒƒ์ด๋‹ค.

2.๊ทธ ๋‹ค์Œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์™€์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ •๋ ฌํ•ด์ฃผ๊ณ  ๋ฐ˜ํ™˜์„ ํ•ด์ค˜์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. (slice ์‚ฌ์šฉ, ๋นˆ ๊ฐ์ฒด์—๋‹ค๊ฐ€ push๋ฅผ ํ•˜๋Š” ๋ถ„๋„ ๊ณ„์…จ์Œ)

=> ์›๋ณธ์„ ๋ฐ”๊พธ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ์›๋ณธ์ด ์ˆ˜์ •๋˜๋ฉด ์ฝ”๋“œ๋ฅผ ์จ๋‚ด๋ ค๊ฐ€๋Š” ๊ณผ์ •์—์„œ ํž˜๋“ค์–ด์งˆ๊นŒ๋ด ๊ทธ๋žฌ๋‹ค.

3.์˜ค๋ฆ„ ์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ ๋‚˜๋ˆŒ ๋•Œ๊ฐ€ ์‚ฌ์‹ค ์กฐ๊ธˆ ํ•ด๋งธ์—ˆ๋Š”๋ฐ ์ € ๋ถ€๋ถ„์€ sort mdn ์„ ๊ฒ€์ƒ‰ํ•ด์„œ ์ž์„ธํžˆ ์ฝ์–ด๋ณธ ํ›„์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!!

4.์กฐ๊ฑด๋ฌธ์„ ์ตœ๋Œ€ํ•œ ๊ฐ„์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด shortcut circuit ์„ ์ผ๋Š”๋ฐ, ์ด๊ฒƒ๋„ ์•Œ๊ณ ๋Š” ์žˆ์—ˆ์ง€๋งŒ ์ •ํ™•ํ•œ ์‚ฌ์šฉ๋ฒ•์„ ๋ชจ๋ฅด๊ณ  ์žˆ์—ˆ๋‹ค ใ… ใ… 

5.๋‹คํ–‰ํžˆ๋„ ์˜ค๋Š˜ ์ •๊ทœ์‹œ๊ฐ„์— ์•Œ๋ ค์ฃผ์…จ๊ณ  ๋ฐ”๋กœ ์ ์šฉํ–ˆ๋”๋‹ˆ, ์ ์šฉํ•œ ํ›„์— ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค!

6.๊ทธ ํ›„์— ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ์ˆ˜์ •ํ•˜์˜€๋‹ค. ํ™•์‹คํžˆ shortcut circuit ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ ์ฝ”๋“œ๊ฐ€ 5์ค„ ์ •๋„ ์ค„์—ˆ๋‹ค.. (์ฒ˜์Œ ์ ์€ ์ฝ”๋“œ๋Š” 20์ค„ ๊ฐ€๊นŒ์ด๋Š” ๋์„ ๊ฒƒ์ด๋‹คโ€ฆ)

๊ทธ ๋‹ค์Œ ๋ ˆํผ๋Ÿฐ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž!



_.sortBy = function (arr, transform, order) {
  order = order || 1;
  transform = transform || _.identity;

  const arrCloned = _.slice(arr);
  return arrCloned.sort(function (a, b) {
    if (transform(a) < transform(b)) {
      return -1 * order;
    }
    return order;
  });
};


์ •๋ง ๊ฐ„๊ฒฐํ–ˆ๋‹คโ€ฆ ๋‚ด ์ฝ”๋“œ์˜ ๋ช‡ ์ค„์„ 1์ค„๋กœ ์ค„์—ฌ๋ฒ„๋ฆฌ๋Š” ๋งˆ๋ฒ•โ€ฆ ์—ญ์‹œ ๋Œ€๋‹จํ•˜๋‹ค..

ํ•ญ์ƒ ๋ณด๊ณ  ๋ฐ˜์„ฑํ•˜์ง€๋งŒโ€ฆ ์™œ ํ•ญ์ƒ ๋‚˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์งœ๊ธฐ๋Š” ํž˜๋“ ๊ฑธ๊นŒ ใ…œใ…œ

์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  โ€œ์•„~โ€ฆ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋˜๋Š” ๊ตฌ๋‚˜โ€ ํ•˜๊ณ  ๋ฐ”๋กœ ์ดํ•ด๋Š” ํ•˜๋Š”๋ฐ

๋ฌธ์ œ๋ฅผ ํ’€ ๋‹น์‹œ์—๋Š” ์ „~~~ํ˜€ ์ƒ๊ฐ์ด ์•ˆ๋‚œ๋‹ค. ์ผ๋‹จ ํ’€๊ณ  ๋ด์•ผํ•˜๋‹ˆ๊นŒ.. ์–ธ์  ๊ฐ„ ๋” ์ž˜ํ•ด์ง€๋ฉด ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋„ ์งค ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.



๐Ÿ‘‰ sort ์˜ˆ์ œ

sort ๋ž€?

sort ๋ž€?

๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— ์ •๋ ฌํ•œ ํ›„ ๊ทธ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ

ํ™•์‹คํžˆ sortํ•จ์ˆ˜๋Š” ์˜ˆ์ œ์ฝ”๋“œ๋ฅผ ๋ด์•ผ ์ดํ•ด๊ฐ€ ๋œ๋‹ค.


sort ํƒ€์ž…๋งˆ๋‹ค ์ •๋ ฌ

  • ๋ฌธ์ž ์ •๋ ฌ
const alpa = ["c", "e", "a", "d", "b"];

alpa.sort(); // ["a", "b", "c", "d", "e"]


  • ์ˆซ์ž ์ •๋ ฌ
const number = [3, 5, 1, 2, 4, 6];

// ์˜ค๋ฅ˜
number.sort(); // ์ˆซ์ž์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Œ (ASCII ๋ฌธ์ž ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

// ์˜ค๋ฆ„ ์ฐจ์ˆœ
number.sort(function (a, b) {
  return a - b;
}); // 1, 2, 3, 4, 5, 6

// ๋‚ด๋ฆผ ์ฐจ์ˆœ
number.sort(function (a, b) {
  return b - a;
}); // 6, 5, 4, 3, 2, 1


  • ๊ฐ์ฒด ์ •๋ ฌ
const whoAmI = [
  {name: "์šฐ์„ฑ", age: 28},
  {name: "์ฝ”๋”ฉ", age: 40},
  {name: "๊นƒ๋ธ”๋กœ๊ทธ", age: 1},
  {name: "์žฌ๋ฐŒ์–ด์š”", age: 99}
];

/* ์ด๋ฆ„์ˆœ */
whoAmI.sort(function (a, b) {
  // ์˜ค๋ฆ„์ฐจ์ˆœ
  return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
  // ๊นƒ๋ธ”๋กœ๊ทธ, ์šฐ์„ฑ, ์žฌ๋ฐŒ์–ด์š”, ์ฝ”๋”ฉ
});

whoAmI.sort(function (a, b) {
  // ๋‚ด๋ฆผ์ฐจ์ˆœ
  return a.name > b.name ? -1 : a.name < b.name ? 1 : 0;
  // ์ฝ”๋”ฉ, ์žฌ๋ฐŒ์–ด์š”, ์šฐ์„ฑ, ๊นƒ๋ธ”๋กœ๊ทธ
});

/* ๋‚˜์ด์ˆœ */
whoAmI.sort(function (a, b) {
  // ์˜ค๋ฆ„์ฐจ์ˆœ
  return a.age - b.age;
  // 1, 28, 40, 99
});

whoAmI.sort(function (a, b) {
  // ๋‚ด๋ฆผ์ฐจ์ˆœ
  return b.age - a.age;
  // 99, 40, 28, 1
});


์ •๋ ฌํ•  Array์˜ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ ๋ฏธ๋งŒ์ผ ๊ฒฝ์šฐ โ€˜sort is not a functionโ€™ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.



๐Ÿ‘‰ short-circuit ?

์˜ค๋Š˜ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž OR || ์— ๋Œ€ํ•ด ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์—, ๋ธ”๋กœ๊น…์„ ํ•ด๋ณผ ๊ฒƒ ์ด๋‹ค!

true || true;
// true

true || false;
// true;

false || false;
// false


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž์—๋Š” ๋‘๊ฐ€์ง€ ์ค‘์š”ํ•œ ํŠน์„ฑ์ด ์žˆ๋‹ค.

์ฒซ์งธ, ์™ผ์ชฝ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ evalutae๋ฅผ ํ•œ๋‹ค.
๋‘˜์งธ, ๋งŒ์•ฝ ์ฒซ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜๊ฐ€ true์ด๋ฉด ์ˆ์„œํ‚ท์€ ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜๋ฅผ ํ™•์ธ์กฐ์ฐจ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

true || ????
//true

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜ ์˜ˆ์ œ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์ดํ•ด๋ฅผ ํ•ด ๋ณด์ž!

๊ฐ์ฒด ๋‚ด๋ถ€์—๋Š” name๊ณผ age๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ์ฒด whoAreYou์˜ job์„ ์•Œ์•„๋ณด๊ณ ์ž ํ• ๋•Œ,

๋ฌธ์ œ๋Š” jop์ด๋ผ๋Š” key๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ||์™€ ์ˆ์„œํ‚ท์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

const whoAreYou = {
  name: "Useong",
  age: 28
};
console.log(whoAreYou.job || "unemployed");
// 'unemployed'


whoAreYou.job์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด undefined ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. undefined๋Š” ๊ฑฐ์ง“ ๊ฐ’์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ||์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์žˆ๋Š” value๊ฐ’์ด ๋ฌด์—‡์ด๋“  ๊ทธ๊ณณ์— ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ์ œ

const a;
const b = null;
const c = undefined;
const d = 7;
const e = "true";

const f = a || b || c || d || e;

console.log(f); // ???


์ •๋‹ต์€??







  • ๋‹ต์•ˆ

์ •๋‹ต์€ 7์ด๋‹ค!!

const a; //  undefined (falsy value)
const b = null; // null (falsy value)
const c = undefined; //  undefined (falsy value)
const d = 7; //  number (NOT falsy)
const e = "true"; // assigment short circuits before reaching here

const f = a || b || c || d || e;

console.log(f); // 7

์ˆ์„œํ‚ท ๊ฐœ๋…์ด ํ—ท๊ฐˆ๋ฆฌ๋ฉด ๋‹ค์‹œ ์ด๊ฑธ ๋ณด๋ฉด์„œ ์ดํ•ดํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค!

์˜ค๋Š˜ ๊ณผ์ œ๋„ ์ œ ๋•Œ ์ž˜ ๋๋‚ด์„œ ํ•œ๊ฒฐ ๊ธฐ๋ถ„์ด ์ข‹์€ ํ•˜๋ฃจ๋‹ค~!

์ด๋ ‡๊ฒŒ ์–ธ๋”๋ฐ” ์Šคํ”„๋ฆฐํŠธ๋„ ๋์ด๋‚ฌ๋‹ค!!!:punch: :punch: :punch:



๐Ÿ‘Š ๋‚ด์ผ์˜ TIW(today I Will)

์„ค๋‚  ์—ฐํœด ๋™์•ˆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 1๋‹จ๊ณ„ ๋‹ค ํ’€๊ธฐ!! (๊ธฐํšŒ๋˜๋ฉด 2๋‹จ๊ณ„๋„ ํ’€๊ธฐ)