반응형

안녕하세요 ~

얼마전 실무에서 사용할 일이 있어 알아보게되었던 부분인데요 ,,, 

객체 내부 Value 중복제거를 알아보겠습니다.

 

 

우선 아래와 같이 Arr안에 같은 키 값을 가진 여러 객체가 있다고 가정해보겠습니다.

 

let rawArr = [
    {
        id : 1,
        name : "hi"
    },
    {
        id : 1,
        name : "A"
    },
    {
        id : 2,
        name : "B"
    },
    {
        id : 2,
        name : "B"
    },
    {
        id : 3,
        name : "hi"
    }
]

 

 

중복으로 들어가 있는 id를 가진 객체를 제거하고싶었습니다.

방법은 여러가지겠지만 ES6문법으로 알아보겠습니다.

 

 

/**
 * 1. reduce some 
 */
const unique_user = rawArr.reduce((prev, now) => {
    if (!prev.some(obj => obj.id === now.id )) prev.push(now);
        return prev;
  }, []);
  
  
/**
 * 2. filter  - 2.1 find
 *            - 2.2 some
 */
let retArr = []
rawArr.filter((origin, index) => {
            // if(!retArr.find((_retData, _retIndex) => origin.id === _retData.id && index !== _retIndex)) retArr.push(origin)
            if(!retArr.some((_retData, _retIndex) => origin.id === _retData.id && index !== _retIndex)) retArr.push(origin)
    }
)

 

1번은 reduce 와 some 을 이용

2번은 filter 와 find, some 을 이용했습니다.

 

아래와 같이 중복제거가 되었습니다.

유용하게 사용하세요 감사합니다.

반응형

안녕하세요.

실력은 부족하지만, 챗봇 개발팀에 속하게 되어 일하면서 코로나 챗봇을 만들어보게 되었습니다.

아직 제공되고있는 코로나 API가 없어 불편해 직접 크롤링을 하게 되었습니다.

크롤링자체가 어려운게 아니기 때문에 누구나 쉽게 따라할 수 있을거라고 생각합니다.

 

이 게시물에서는 질병관리본부 메인 페이지에 있는 코로나 데이터 정보를 크롤링 해 볼것이며 원하는대로 응용해 사용하신다면 좋을 것같네요.

 

 


http://ncov.mohw.go.kr/

 

코로나바이러스감염증-19(COVID-19)

코로나바이러스감염증-19 정식 홈페이지로 발생현황, 확진환자 이동경로, 대상별 유의사항, 홍보자료, FAQ, 관련기관(보건소, 선별진료소 찾기), 정부 브리핑, 대응지침 등 안내

ncov.mohw.go.kr

위에 있는 url을 타고 들어가 긁어올 부분을 찾겠습니다.

저는 확진환자, 완치... 등등 의 부분을 긁어올 생각인데요.

확진환자 부분에서 오른쪽 클릭 ==> 검사 를 눌러 HTML태그를 확인합니다.

 

제가 원하는 부분의 태그를 확인할 수 있고 부모태그와 자식태그를 확실하게 알아야 긁어올 수 있습니다.

아래에 태그라인을 보면 쉽게 파악할 수 있습니다.

 

 

 

이제 Node.js를 이용해 원하는 데이터를 가져올건데 쉽게 사용할 수 있는 방법은 2가지가 있습니다.

 

1. request 모듈 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const request = require("request");
const axios = require("axios");
const cheerio = require("cheerio");
const url = "http://ncov.mohw.go.kr/";
const log = console.log;
 
// ### 1. request 사용 ###
request.post(url, function (err, res, body) { // 웹에 요청을 보내고, 요청에 해당하는 페이지를 가져오는 request 사용.
    
    const $ = cheerio.load(body) // 페이지를 파싱해 원하는 일부분을 가공하기위해 cheerio 모듈 사용. jquery 문법을 사용할 수 있어 편리하다.
    let parentTag = $("div.liveNum ul.liveNum li");
    
    let resultArr = [];
    parentTag.each(function(i, elem){
        let itemObj = { // 원하는대로 불러와 사용하기 편하게 객체에 저장.
            _text : $(this).find("strong").text(), 
            _num :$(this).find("span").text()
        }
        resultArr.push(itemObj); // 긁어온 데이터를 itemObj 객체에 넣고 itemObj를 resultArr 배열에 push.
    })
 
    resultArr.forEach(elem => {
        log(`현재 ${elem._text}의 현황 : ${elem._num}`);
    })
})
cs

 

2. axios 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// ### 2. axios 사용 ###
// axios는 Promise를 기반으로 웹 요청을 보낼수 있어 request 대안으로 사용 가능하다.
const getData = async () => {
    try{
        return await axios.get(url)
    }catch(error){
        log(err)
    }
}
 
getData().then(html => {
    
    const $ = cheerio.load(html.data);
    let parentTag = $("div.liveNum ul.liveNum li");
    
    let resultArr = [];
    parentTag.each(function(i, elem){
        let itemObj = { 
            _text : $(this).find("strong").text(), 
            _num :$(this).find("span").text()
        }
        resultArr.push(itemObj);
    })
 
    resultArr.forEach(elem => {
        log(`현재 ${elem._text}의 현황 : ${elem._num}`);
    })
})
cs

이 둘의 결과값은 아래와 같이 나옵니다.

 

간단한 예제이지만 입맛대로 응용해서 사용하기 위한 초안정도로 사용하시면 될 것 같습니다.

감사합니다.

반응형

 

bin/www

bin/www 파일은 http 모듈에 express 모듈을 연결하고 포트를 지정하는 부분.

 

// app, debug, http 모듈들을 가져옵니다.
// debug 모듈은 콘솔에 로그를 남기는 모듈입니다.
var app = require('../app');
var debug = require('debug')('ex-test:server');
var http = require('http');

var port = normalizePort(process.env.PORT || '3000');

// 서버가 실행될 port를 설정합니다.
// 기본값으로 3000번 포트를 이용하도록 되어있다.
// app.set('key', 'value') 로 값을 저장할 수 있다.
app.set('port', port); 

var server = http.createServer(app);

// port를 연결하고 서버를 실행한다.
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

 

app.js

중간의 미들웨어를 거쳐 클라이언트의 요청을 받아 처리한 후, 다시 클라이언트에게 응답한다.

 

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

// express 패키지를 호출해 app 변수 객체를 만들었다. 각종 기능을 연결하는 변수.
var app = express(); 

// view engine setup
// express 앱 설정 부분
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// app.use로 미들웨어를 연결하는 부분이다.
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

참고서적 조현영 「Node.js 교과서」 길벗(2018) p188~192

반응형

 

Express-generator 전역 설치하기

$ npm i -g express-generator

 

 

원하는 폴더로 이동 후 패키지 생성. ejs 를 사용하겠습니다.

express [ 사용할 패키지 이름 ] --view=ejs

 

$ express ex_test --view=ejs

 

 

* 설치중에 보안 오류: (:) [], PSSecurityException... FullyQualifiedErrorId : UnauthorizedAccess 같은 문구가 뜰 때 조치법

 

윈도우 powershell 관리자 권한 실행 ==> set-executionpolicy unrestricted 입력 ==> executionpolicy 명령어로 Unrestricted 출력되면 성공 ( 스크립트 허용 )

 

 

$ npm i 까지 해주면 모듈까지 설치 완료.

 

$ npm start => http://localhost:3000

 

 

익스프레스 접속 성공.

반응형

 

npm

Node Package Manager로써 node의 특정 기능을 하는 패키지가 60만개이상 등록되어있다.

 

package.json

설치한 패키지의 버전을 관리하는 파일로써 프로젝트를 시작하기 전에 만드는 것이 좋다.

 

시작하려는 폴더에서 터미널에 $npm init 입력

 

다음과 같이 진행을하면 package.json 파일이 만들어집니다.

 

 

아래의 dependencies 부분에는 제가 따로 설치한 express의 버전 정보가 나와있습니다.

$ npm install express  명령을 통해 설치했습니다.

 

이와같이 package.json 파일을 통해 설치한 패키지들을 손쉽게 관리할 수 있습니다. 감사합니다.

반응형

# Template Literal

 

기존의 큰따옴표나 작은따옴표로 감싸는 문자열과는 다르게 백틱(')으로 감싼다.

백틱( ` )은 문자 리터럴로 화면에 보이는대로 출력하고 작은따옴표( ' )는 문자를 코드로 인식한다.

1
2
3
4
5
6
7
8
9
var name = 'HELLO';
var letter = `aaaaaaaaaaaaaaaaaaaaaaaaa  ${name}
 
 
bbbbbbb         ccccccccccc
`;
 
 
console.log(letter);
cs

 

백틱(`)안의 문자열은 줄바꿈이나 스페이스바 입력까지 그대로 출력된다.

 

 

+ Recent posts