program tip

jQuery없이 node.js에서 JSON 결합 또는 병합

radiobox 2020. 10. 25. 12:02
반응형

jQuery없이 node.js에서 JSON 결합 또는 병합


나는 JSON그런 여러

var object1 = {name: "John"};
var object2 = {location: "San Jose"};

그들은 중첩되거나 그런 것이 아닙니다. 기본적으로 다른 분야입니다. 다음 과 같이 node.jsJSON 에서 하나의 단일로 결합해야 합니다.

{name: "John", location: "San Jose"}

jQuery 를 잘 사용할 수 있습니다 . 다음은 브라우저에서 작동하는 예제입니다.

http://jsfiddle.net/qhoc/agp54/

그러나 node.js 에서 이것을 수행하면 jQuery를로드하고 싶지 않습니다 (약간 과도하게 사용되며 node.js의 jQueryWindows 컴퓨터 에서 작동하지 않음 ).

그래서 jQuery$.extend() 없이 비슷한 일을하는 간단한 방법이 있습니까?


정상적인 루프?

function extend(target) {
    var sources = [].slice.call(arguments, 1);
    sources.forEach(function (source) {
        for (var prop in source) {
            target[prop] = source[prop];
        }
    });
    return target;
}

var object3 = extend({}, object1, object2);

이것이 기본적인 출발점입니다. hasOwnProperty검사 와 같은 것을 추가 하거나 여러 소스 객체에 동일한 식별자를 가진 속성이있는 경우를 처리하기 위해 로직을 추가 할 수 있습니다.

다음은 작동하는 예 입니다.

참고 : "JSON"이라고 부르는 것은 실제로 일반적인 JavaScript 객체입니다. JSON은 JavaScript와 일부 구문을 공유하는 단순한 텍스트 형식입니다.


" Object.assign () "을 사용해야합니다.

얕은 병합의 간단한 사용 사례를 위해 바퀴를 재발 명 할 필요가 없습니다.

Object.assign () 메서드는 하나 이상의 소스 객체에서 대상 객체로 열거 가능한 모든 속성 값을 복사하는 데 사용됩니다. 대상 개체를 반환합니다.

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 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, target object itself is changed

Node.js 의 사람들도 그렇게 말합니다 .

_extend내부 NodeJS 모듈 외부에서 사용하도록 의도되지 않았습니다. 커뮤니티는 어쨌든 그것을 발견하고 사용했습니다. 더 이상 사용되지 않으며 새 코드에서 사용해서는 안됩니다. JavaScript는 .NET을 통해 매우 유사한 내장 기능을 제공 Object.assign합니다.


최신 정보:

스프레드 연산자를 사용할 수 있습니다.

버전 8.6 부터는 Node.js에서 기본적으로 스프레드 연산자사용할 있습니다. 아래 예 :

let o1 = { a: 1 };
let o2 = { b: 2 };
let obj = { ...o1, ...o2 }; // { a: 1, b: 2 }

Object.assign 그래도 여전히 작동합니다.


PS1 : 당신은 실제로에 관심이 있다면 깊은 병합 (이 내부 객체 데이터에 - 어떤 깊이 - 재귀 적으로 병합), 당신은 같은 패키지를 사용할 수 있습니다 deepmerge을 , 할당 깊이 또는 lodash.merge 아주 작고 간단한에있는, 사용하다.

PS2 : Object.assign은 Node.js의 0.X 버전에서는 작동하지 않습니다 . 이러한 버전 중 하나를 사용하는 경우 ( 지금 까지는 안됩니다)require("util")._extend 위의 Node.js 링크에 표시된대로 사용할 수 있습니다. 자세한 내용은 동일한 질문에 대한 tobymackenzie의 답변을 확인 하세요 .


노드 버전> = 4를 사용하는 경우 사용 Object.assign()하십시오 ( Ricardo Nolde의 답변 참조 ).

Node 0.x를 사용하는 경우 내장 된 util._extend가 있습니다.

var extend = require('util')._extend
var o = extend({}, {name: "John"});
extend(o,  {location: "San Jose"});

딥 카피를 수행하지 않고 한 번에 두 개의 인수 만 허용하지만 내장되어 있습니다. 노드의 객체 복제에 대한 질문에서 언급 한 내용을 보았습니다 : https://stackoverflow.com/a/15040626 .

"비공개"방법을 사용하는 것이 염려된다면 항상 프록시 할 수 있습니다.

// myutil.js
exports.extend = require('util')._extend;

사라지는 경우 자체 구현으로 교체하십시오. 이것은 (대략) 그들의 구현입니다.

exports.extend = function(origin, add) {
    if (!add || (typeof add !== 'object' && add !== null)){
        return origin;
    }

    var keys = Object.keys(add);
    var i = keys.length;
    while(i--){
        origin[keys[i]] = add[keys[i]];
    }
    return origin;
};

Underscore 'sextend 는 James가 언급 한 것처럼이를 달성하는 가장 쉽고 빠른 방법입니다.

밑줄을 사용한 예는 다음과 같습니다.

var _ = require('underscore'), // npm install underscore to install
  object1 = {name: "John"},
  object2 = {location: "San Jose"};

var target = _.extend(object1, object2);

object 1은 object2의 속성을 가져 와서 target에 할당됩니다. object1이 수정되는지 여부에 따라 다음과 같이 할 수도 있습니다.

var target = {};
_.extend(target, object1, object2);

merge를 사용하십시오 .

$ npm install merge

샘플 코드 :

var merge = require('merge'), // npm install -g merge
    original, cloned;

console.log(

    merge({ one: 'hello' }, { two: 'world' })

); // {"one": "hello", "two": "world"}

original = { x: { y: 1 } };

cloned = merge(true, original);

cloned.x.y++;

console.log(original.x.y, cloned.x.y); // 1, 2

이 스레드가 너무 오래되었음을 알지만 로깅 목적으로 여기에 대답을 넣었습니다.

위의 주석 중 하나에서 종속성 목록에 'connect'라이브러리가있는 프로젝트에서 'express'를 사용하고 싶다고 언급했습니다. 실제로 'connect.utils'라이브러리에는 트릭을 수행하는 '병합'메소드가 포함되어 있습니다. 따라서 새로운 타사 라이브러리를 추가하지 않고도 타사 구현을 사용할 수 있습니다.


다음은 JSON을 병합하는 간단한 솔루션입니다. 나는 다음을했다.

  • .NET을 사용하여 각 JSON을 문자열로 변환합니다 JSON.stringify(object).
  • +연산자를 사용하여 모든 JSON 문자열을 연결합니다 .
  • 패턴 /}{/g","
  • 결과 문자열을 다시 JSON 개체로 구문 분석

    var object1 = {name: "John"};
    var object2 = {location: "San Jose"};
    var merged_object = JSON.parse((JSON.stringify(object1) + JSON.stringify(object2)).replace(/}{/g,","))
    

결과적으로 병합 된 JSON은

{name: "John", location: "San Jose"}

흡수 라는 경량 npm 패키지를 사용할 수도 있습니다.

27 줄의 코드, 1kb이며 재귀를 사용하여 깊은 개체 병합을 수행합니다.

var absorb = require('absorb');
var obj1, obj2;

obj1 = { foo: 123, bar: 456 };
obj2 = { bar: 123, key: 'value' }

absorb(obj1, obj2);

console.log(obj1); // Output: { foo: 123, bar: 123, key: 'value' }

또한이를 사용하여 복제본을 만들거나 소스 개체에없는 경우에만 값을 전송할 수 있습니다.이 작업을 수행하는 방법은 제공된 링크에 자세히 설명되어 있습니다.


Node.js에서 쉽게 할 수있는 방법이 있습니다.

var object1 = {name: "John"};
var object2 = {location: "San Jose"};

이것을 결합 / 확장하기 위해 ...ECMA6에서 연산자를 사용할 수 있습니다.

var object1 = {name: "John"};
var object2 = {location: "San Jose"};

var result = {
  ...object1,
  ...object2
}

console.log(result)


중첩 된 객체 확장이나 배열 교체와 같은 특별한 동작이 필요한 경우 Node.js의 extendify를 사용할 수 있습니다 .

var extendify = require('extendify');

_.extend = extendify({
    inPlace: false,
    arrays : 'replace',
    isDeep: true
});

obj1 = {
    a:{
        arr: [1,2]
    },
    b: 4
};

obj2 = {
    a:{
        arr: [3]
    }
};

res = _.extend(obj1,obj2);
console.log(JSON.stringify(res)); //{'a':{'arr':[3]},'b':4}

Lodash 는 이러한 종류의 유틸리티를위한 또 다른 강력한 도구 벨트 옵션입니다. 참조 : _.merge()(재귀 적)

var object = {
  'a': [{ 'b': 2 }, { 'd': 4 }]
};
var other = {
  'a': [{ 'c': 3 }, { 'e': 5 }]
}; 
_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } 

Object.assign () 메소드를 사용하여 쉽게 할 수 있습니다.

 var object1 = {name: "John"};
 var object2 = {location: "San Jose"};
 var object3 = Object.assign(object1,object2);
 console.log(object3);

이제 object3은 {이름 : 'John', 위치 : 'San Jose'}입니다.


스프레드 연산자를 사용하십시오. 버전 8.6부터 Node에서 지원됩니다.

const object1 = {name: "John"};
const object2 = {location: "San Jose"};

const obj = {...object1, ...object2}

console.log(obj)
//   {
//     "name": "John",
//     "location": "San Jose"
//   }


아래 코드는 중첩 된 객체가있는 두 개의 JSON 객체를 병합하는 데 도움이됩니다.

function mergeJSON(source1,source2){
    /*
     * Properties from the Souce1 object will be copied to Source2 Object.
     * Note: This method will return a new merged object, Source1 and Source2 original values will not be replaced.
     * */
    var mergedJSON = Object.create(source2);// Copying Source2 to a new Object

    for (var attrname in source1) {
        if(mergedJSON.hasOwnProperty(attrname)) {
          if ( source1[attrname]!=null && source1[attrname].constructor==Object ) {
              /*
               * Recursive call if the property is an object,
               * Iterate the object and set all properties of the inner object.
              */
              mergedJSON[attrname] = zrd3.utils.mergeJSON(source1[attrname], mergedJSON[attrname]);
          } 

        } else {//else copy the property from source1
            mergedJSON[attrname] = source1[attrname];

        }
      }

      return mergedJSON;
}

Lodash를 사용할 수 있습니다.

const _ = require('lodash');

let firstObject = {'email' : 'email@email.com};
let secondObject = { 'name' : { 'first':message.firstName } };
_.merge(firstObject, secondObject)

A better approach from the correct solution here in order to not alter target:

function extend(){
  let sources = [].slice.call(arguments, 0), result = {};
  sources.forEach(function (source) {
    for (let prop in source) {
      result[prop] = source[prop];
    }
  });
  return result;
}

You can do it inline, without changing any variables like this:

let obj1 = { name: 'John' };
let obj2 = { surname: 'Smith' };
let obj = Object.assign({}, obj1, obj2); // { name: 'John', surname: 'Smith' }

Let object1 and object2 be two JSON object.

var object1 = [{"name": "John"}];
var object2 = [{"location": "San Jose"}];

object1.push(object2);

This will simply append object2 in object1:

[{"name":"John"},{"location":"San Jose"}]

참고URL : https://stackoverflow.com/questions/14974864/combine-or-merge-json-on-node-js-without-jquery

반응형