JS …item 사용법

 

...item.json은 **객체 펼치기(스프레드)**로 “item.json이 가진 모든 필드”를 현재 새 객체에 복사해 넣는 것이고, 그 아래의 result: ...는 새로 result 필드를 추가(또는 덮어쓰기) 하는 겁니다.

$input.all().map(item => ({
  ...item.json,
  result: item.json.score >= 60 ? 'pass' : 'fail',
}))

한 아이템 기준으로 정확히 무슨 일이 벌어지나

예를 들어 item.json이 아래라면:

{ "name": "kim", "score": 75 }
  1. ...item.json 때문에 새 객체는 일단 이렇게 됩니다:
{ name: "kim", score: 75 }
  1. 그 다음 줄에서 result를 계산해서 붙입니다:
  • item.json.score >= 60 → 75 >= 60 → true
  • 그래서 result: 'pass'

최종 결과 객체:

{ "name": "kim", "score": 75, "result": "pass" }

즉, item.json.score는 스프레드와 무관하게, “점(.) 접근”으로 item.json 안의 score 값을 읽어온 것뿐입니다.


핵심 규칙 1: 스프레드는 “복사”, 점 접근은 “조회”

  • ...item.json : item.json의 키/값을 새 객체에 복사
  • item.json.score : item.json에서 score 값을 읽기

핵심 규칙 2: 같은 키가 겹치면 “뒤에 있는 것이 이김(덮어씀)”

아래처럼 item.json에 이미 result가 있어도,

{ "name": "kim", "score": 75, "result": "unknown" }

코드는 result를 다시 계산해서 덮어씁니다:

({
  ...item.json,                // result: "unknown" 포함해서 복사됨
  result: item.json.score >= 60 ? 'pass' : 'fail',  // 여기서 result 덮어씀
})

결과:

{ "name": "kim", "score": 75, "result": "pass" }

반대로 “기존 result를 유지하고 싶다”면 순서를 바꾸면 됩니다:

({
  result: item.json.score >= 60 ? 'pass' : 'fail',
  ...item.json, // item.json의 result가 있으면 이게 마지막에 와서 덮어씀
})

추가 예시 1) 스프레드 없이도 가능 (필드 명시)

$input.all().map(item => ({
  name: item.json.name,
  score: item.json.score,
  result: item.json.score >= 60 ? 'pass' : 'fail',
}))
  • 필요한 필드만 골라서 만들고 싶을 때 좋습니다.

추가 예시 2) score가 없을 때 대비(기본값 처리)

score가 없으면 fail로 처리:

$input.all().map(item => ({
  ...item.json,
  result: (item.json.score ?? 0) >= 60 ? 'pass' : 'fail',
}))

추가 예시 3) result에 “사유”도 같이 만들기

$input.all().map(item => {
  const score = item.json.score ?? 0;
  return {
    ...item.json,
    result: score >= 60 ? 'pass' : 'fail',
    reason: score >= 60 ? `ok(${score})` : `low(${score})`,
  };
})

추가 예시 4) 등급까지 만들기 (여러 조건)

$input.all().map(item => {
  const s = item.json.score ?? 0;
  const grade = s >= 90 ? 'A' : s >= 80 ? 'B' : s >= 70 ? 'C' : s >= 60 ? 'D' : 'F';
  return { ...item.json, grade, result: s >= 60 ? 'pass' : 'fail' };
})

원하시면 질문 하나만: item.json.score가 항상 숫자로 들어오나요, 아니면 "75" 같은 문자열로도 들어오나요? 문자열이면 비교 전에 Number(item.json.score)로 변환하는 예시도 같이 맞춰드릴게요.

댓글