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의 jQuery 가 Windows 컴퓨터 에서 작동하지 않음 ).
그래서 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
_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
'program tip' 카테고리의 다른 글
Swift 사전을 콘솔에 예쁘게 인쇄하는 방법이 있습니까? (0) | 2020.10.25 |
---|---|
Android 열 '_id'가 존재하지 않습니까? (0) | 2020.10.25 |
$ date + 1 년? (0) | 2020.10.25 |
Windows 서비스를 설치할 수 없습니다. (0) | 2020.10.25 |
CMake가 OpenSSL 라이브러리를 찾을 수 없음 (0) | 2020.10.25 |