splice, reduce, charCodeAt, for of, substr, substring

Imnottired·2023년 3월 14일
0

splice

Mutable

Array​.prototype​.splice()

splice() 메소드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다. 이 메소드는 원본 배열 자체를 수정한다.

splice(start[, deleteCount[, item1[, item2[, ...]]]])

start: 배열의 변경을 시작할 인덱스.

음수를 지정한 경우: 배열의 끝에서부터 요소를 센다.
배열의 길이보다 큰 수를 지정한 경우: 실제 시작 인덱스는 배열의 길이로 설정
절대값이 배열의 길이보다 큰 경우: 0으로 세팅

deleteCount: 배열에서 제거할 요소의 수.

생략 / 값이 array.length - start보다 큰 경우: start부터의 모든 요소를 제거.
0 이하의 수를 지정: 어떤 요소도 제거되지 않는다.

item1, item2, ... : 배열에 추가할 요소.

지정하지 않는 경우: splice()는 요소 제거만 수행한다.

반환값: 제거한 요소를 담은 배열.

아무 값도 제거하지 않았으면 빈 배열을 반환한다.

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
 
var arr1 = arr.splice(10, 2, 'a', 'b', 'c');
 
console.log(arr);   // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "a", "b", "c"]
console.log(arr1);  // [11, 12]
splice() 함수를 사용하면 원본 배열인 arr이 변경된다.

10번째 인덱스부터 2개의 요소를 삭제하고 'a', 'b', 'c'를 추가했으므로

11과 12가 삭제되고 이 삭제된 요소들의 배열은 arr1 변수에 담긴다.

https://im-developer.tistory.com/103

reduce

immutable
Array.prototype.reduce()

첫번째 인자로 콜백을 넣는다.

콜백에 첫번째 인자는 초기값, 현재값, index 순이다.
그리고 2번째인자로는 초기값을 받는다.

const arr = [1, 2, 3, 4, 5];
const result = arr.reduce((acc, cur, idx) => { return acc += cur; }, 0);
console.log(result);  // 15

const arr2 = [1, 2, 3, 4, 5];
const result2 = arr2.reduce((acc, cur, idx) => { return acc += cur; }, 10);
console.log(result2);  // 25

https://miiingo.tistory.com/365

var input = require("fs")
  .readFileSync("20230314/8/example.txt")
  .toString()
  .split("\n");

input = input[0].split(" ").map((el) => Number(el));
let sum = input.reduce((a, b) => a + b, 0);
console.log(input);
for (let i = 0; i < input.length; i++) {
  for (let j = i + 1; j + 1 < input.length; j++) {
    let twoSum = input[i] + input[j];
    if (twoSum === 40) {
      input.splice(j, 1);
      input.splice(i, 1);
    }
  }
}

//다 더한 다음에 2개씩 합친 값을 뺴고 100이 되는 것을 찾자
//reduce, splice 쓰자 splice는 기존의 것을 변하게함 mutable
//실수 합친값을 갯수로 놓음
// j자리에 i 넣음
//비효율적으로 돌게 놔뒀음
// j=0 이아니라 겹치는 거 없이 j= i+1로 놓아야 효율적임

console.log(input);

for문 작성할 때 합친 것을 length로 배정했다.
j자리에 i를 놓았고
j=0;으로 돌리는것보다 겹치는 거 없이 했어야했다.
조금 더 적어서 단계를 나눠보자

charCodeAt, fromCharCode

charCodeAt은 값을 주면
ASCII(아스키)코드로 변환해서 보여준다.
반대로 fromCharCode는 아스키코드를 아스키표에 맞추어서 변경해준다.

string.charCodeAt(index)


var stringName = '자바스크립트';
console.log(stringName.charCodeAt(0)); // 51088
// http://www.unicode.org/charts/PDF/UAC00.pdf 에서 '자'을 찾아보면 'C790'인데 이것은 16진수다.
// 이를 10진수로 변환하면 51088 된다.

index에는 2진수로할지 뭘로할지 쓰면 된다.

대문자는 65~90 (26개)
소문자는 97~122

대문자 A->소문자 a로 만들려면 32를 더 해주면 된다
모든 관계는 일치한다

이 문제에서 실수한 것 중 하나는

>=로 작성해야하는데 =>로 작성하였다 신경써서 작성해보자

var input = require("fs")
  .readFileSync("20230314/12/example.txt")
  .toString()
  .split("\n");

console.log(input);

let inputArray = input[0].split("");
let result = "";
for (let i of inputArray) {
  let num = i.charCodeAt();

  if (num >= 97 && num <= 122) {
    result += String.fromCharCode(num - 32);
  } else {
    result += i;
  }
}
console.log(result);

기존 소문자에서 32를 빼주는 방법으로 바꿔주었다.
이것 외에도 toLowerCase()로 확인하고 .toUpperCase()로 해주는 방법이있다.

for of문

for문 대신에 배열을 돌릴 수있는 for문 Array버전


for of 해당 값을 수정해도 먹지 않는다.

for문 대신 쓰는 이유는

// for (let i = 0; i < inputArray.length; i++) {
//   if (inputArray[i] === inputArray[i].toLowerCase()) {
//     console.log(inputArray[i]);
//   }

for (let i of inputArray) {
  if (i === i.toLowerCase()) {
    result += i.toUpperCase();
  } else {
    result += i.toLowerCase();
  }
}

코드가 간결해진다.
Array[i]가 아닌 i로 선언해서 간단하게 처리할 수 있고 식도 짧아져서 편하다.

substr & substring


substr은 첫번째 인자를 시작으로 두번째인자 갯수만큼 가져온다
예로 2,4를 하면 2번째 인덱스를 포함하여 뒤로 4개를 가져온다.

substring은 둘다 인덱스값을 받는다. 마지막 문자를 포함하지 않고 받아온다.

indexOf

indexOf는 문자를 찾아준다
첫번째 인자는 찾을 문자를 두번째인자는 어디서 부터 찾을지 정해준다.

문제 18

var input = require("fs")
  .readFileSync("20230314/17/example.txt")
  .toString()
  .split("\n");

let num = input.splice(0, 1);
console.log(num);

console.log(input);
// for (let i = 0; i < input.length; i++) {
//   if (input.indexOf(input[i]) === i) {
//     console.log(input[i]);
//   }
// }

let result = input.filter((el, index) => {
  if (input.indexOf(el) === index) {
    return true;
  }
});
console.log(result.join("\n"));

for문을 사용하는 것보다 array함수인 filter를 사용해서 하는 것도
심플해서 좋았다.

profile
많이 배우려고 하고 합니다. 아쉬운 점이 있으면 말씀해주시면 감사하겠습니다.

0개의 댓글