簡體   English   中英

是否有一種純粹的功能方式來合並JavaScript中的對象?

[英]Is there a purely functional way to merge objects in JavaScript?

假設我有一個具有某些屬性的對象:

const obj = {
  key1: 1
  key2: 2
}

我有一個函數someFunc ,它將一個對象作為參數。 我想用一些額外的參數傳遞obj ,比如

someFunc({
  key1: 1
  key2: 2
  otherKey: 3
})

問題是我不想實際改變obj的狀態。 someFunc之后,它不應該包含otherKey作為屬性。

這使得Object.assign問題:

let ident = someObj => someObj;

ident(Object.assign(obj, {otherKey: 3}))
console.log(someObj); // -> {key1: 1, key2: 2, otherKey: 3}

創建一個新變量並otherKey = 3分配otherKey = 3會做同樣的事情。

我知道我可以使用某種深度復制 - 但這似乎是處理一個相當簡單的問題的一種不必要的復雜方式。

執行此操作的最優雅方式是使用一些對象obj1, obj2的純函數,返回與Object.assign(obj1, obj2)相同的輸出,但不改變它們。 是否有一些明顯的方法在JS中執行此操作,我還沒有看到,或者我是否必須使用其他庫?

只需將參數反轉為Object.assign - 它會將obj的屬性添加到新對象:

ident(Object.assign({otherKey: 3}, obj))

警告

但是你必須小心obj中已經存在的屬性,因為它們會覆蓋新數組中的屬性。

你正在處理不變性 另一種方法是使用ES6的擴展運算符:

 const obj1 = { key1: 1, key2: 2, } const obj2 = { key1: 1, key2: 12, otherKey: 3 }; const merged = { ...obj1, ...obj2 }; console.log('merged: ', merged); console.log('obj1: ', obj1); console.log('obj2: ', obj2); 

你會看到obj1和obj2都沒有改變

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM