[javascript] 여러 JavaScript 개체의 속성을 연결하는 방법

여러 JavaScript 개체 (연관 배열)를 “추가”하는 가장 좋은 방법을 찾고 있습니다.

예를 들면 다음과 같습니다.

a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };

계산하는 가장 좋은 방법은 무엇입니까?

{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }



답변

Object.assign()Javascript에서 기본적으로이를 달성하기 위해 ECMAscript 6이 도입 되었습니다.

Object.assign () 메소드는 대상체에 하나 이상의 소스 개체로부터 자신의 모든 열거 속성 값을 복사하는 데 사용된다. 대상 개체를 반환합니다.

Object.assign ()에 대한 MDN 문서

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }

Object.assign많은 최신 브라우저에서 지원 되지만 아직 전부는 아닙니다. BabelTraceur 와 같은 변환기 를 사용하여 이전 버전과 호환되는 ES5 JavaScript를 생성하십시오.


답변

다음 $.extend과 같이 jquery를 사용할 수 있습니다 .

let a = { "one" : 1, "two" : 2 },
    b = { "three" : 3 },
    c = { "four" : 4, "five" : 5 };

let d = $.extend({}, a, b, c)

console.log(d)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


답변

이렇게해야합니다.

function collect() {
  var ret = {};
  var len = arguments.length;
  for (var i = 0; i < len; i++) {
    for (p in arguments[i]) {
      if (arguments[i].hasOwnProperty(p)) {
        ret[p] = arguments[i][p];
      }
    }
  }
  return ret;
}

let a = { "one" : 1, "two" : 2 };
let b = { "three" : 3 };
let c = { "four" : 4, "five" : 5 };

let d = collect(a, b, c);
console.log(d);

산출:

{
  "one": 1,
  "two": 2,
  "three": 3,
  "four": 4,
  "five": 5
}


답변

ECMAScript 6에는 확산 구문이 있습니다. 이제 다음과 같이 할 수 있습니다.

const obj1 = { 1: 11, 2: 22 };
const obj2 = { 3: 33, 4: 44 };
const obj3 = { ...obj1, ...obj2 };

console.log(obj3); // {1: 11, 2: 22, 3: 33, 4: 44}


답변

Underscore 에는이를 수행하는 방법이 거의 없습니다.

1. _.extend (대상, * 소스)

의 속성을 모두 복사 소스가 받는 개체 대상 객체 및 반환 대상 개체를.

_.extend(a, _.extend(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

또는

_.extend(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.extend(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

2. _.defaults (객체, * 기본값)

기입 정의 의 속성 객체 로부터 값을 디폴트 객체 및 반환 개체를 .

_.defaults(a, _.defaults(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

또는

_.defaults(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.defaults(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }


답변

함수가 3 개의 인수로 제한되어야하는 이유는 무엇입니까? 또한 hasOwnProperty.

function Collect() {
    var o={};
    for(var i=0;i<arguments.length;i++) {
      var arg=arguments[i];
      if(typeof arg != "object") continue;
      for(var p in arg) {
        if(arg.hasOwnProperty(p)) o[p] = arg[p];
      }
    }
    return o;
}


답변

이제 Object.assign () 보다 짧은 구문을 사용하여 얕은 복제 (프로토 타입 제외) 또는 객체 병합이 가능합니다 .

객체 리터럴 에대한 스프레드 구문 ECMAScript 2018 에서 도입되었습니다) :

const a = { "one": 1, "two": 2 };
const b = { "three": 3 };
const c = { "four": 4, "five": 5 };

const result = {...a, ...b, ...c};
// Object { "one": 1, "two": 2 , "three": 3, "four": 4, "five": 5 }

확산 (…) 연산자많은 최신 브라우저 에서 지원 되지만 전부는 아닙니다.

따라서 Babel 과 같은 트랜스 파일러 를 사용하여 ECMAScript 2015+ 코드를 현재 및 이전 브라우저 또는 환경에서 이전 버전과 호환되는 JavaScript 버전으로 변환 하는 것이 좋습니다 .

다음은 Babel이 생성 하는 동등한 코드 입니다 .

"use strict";

var _extends = Object.assign || function(target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];
    for (var key in source) {
      if (Object.prototype.hasOwnProperty.call(source, key)) {
        target[key] = source[key];
      }
    }
  }
  return target;
};

var a = { "one": 1, "two": 2 };
var b = { "three": 3 };
var c = { "four": 4, "five": 5 };

var result = _extends({}, a, b, c);
// Object { "one": 1, "two": 2 , "three": 3, "four": 4, "five": 5 }