javascript - online - npm是什麼




在沒有jQuery的情況下在node.js上組合或合併JSON (12)

你應該使用“ 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通過Object.assign提供了非常相似的內置功能。

也就是說,請記住, Object.assign不適用於0.X版本的Node.js。 如果你正在使用其中一個版本,你可以使用require("util")._extend ,如上面的鏈接所示 - 你不應該有它的問題 ,因為它不會再為這些舊版本更新。

更新:

版本8.6開始 ,可以在Node.js中原生使用spread運算符 。 示例如下:

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

Object.assign仍然有效。

PS :如果你真的對深度合併感興趣(其中內部對像數據 - 以任何深度 - 遞歸合併),你可以使用像deepmergeassign-deeplodash.merge這樣的lodash.merge ,它們非常小而且簡單使用。

我有多個JSON

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

它們不是嵌套或類似的東西。 只是基本不同的領域。 我需要將它們組合成node.js中的一個JSON ,如下所示:

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

我可以使用jQuery就好了。 以下是瀏覽器中的一個工作示例:

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

但是如果我在node.js中這樣做,我不想加載jQuery(這有點過度使用,加上node.js'jQuery在我的Windows機器上不起作用)。

那麼有一種簡單的方法可以在不使用jQuery的情況下執行與$.extend()類似的操作嗎?


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 }] } 

下面的代碼將幫助您合併兩個具有嵌套對象的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;
}

你也可以使用這個名為absorb輕量級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' }

如果源對像中不存在值,您也可以使用它來製作克隆或僅傳輸值,如何在提供的鏈接中詳細說明。


你可以內聯,不改變任何變量:

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

使用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

使用傳播運營商。 自8.6版以來,它在Node中受支持

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

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

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


在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}

從正確的解決方案中獲得更好的方法,以便不改變目標:

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

正如詹姆斯評論的那樣, Underscore是實現這一目標的最簡單,最快捷的方式。

這是使用下劃線的示例:

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

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

對象1將獲取object2的屬性並返回並分配給目標。 你可以這樣做,這取決於你是否介意object1被修改:

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

object1object2成為兩個JSON對象。

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

object1.push(object2);

這只會在object1追加object2

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




node.js