2015-10-10 91 views
35

在不改變原始對象的情況下從特定鍵的對象中刪除值的方法是什麼?從對象中刪除值而不改變它

我想這樣做:

let o = {firstname: 'Jane', lastname: 'Doe'}; 
let o2 = doSomething(o, 'lastname'); 
console.log(o.lastname); // 'Doe' 
console.log(o2.lastname); // undefined 

我知道有很多關於這樣的任務不變性庫,但我想脫身,而不庫。但是要做到這一點,一個要求就是在整個代碼中使用一個簡單而簡短的方法,而不用將該方法作爲一個效用函數抽象出來。

E.g.用於添加值我做到以下幾點:

let o2 = {...o1, age: 31};

這是很短,易記,並不需要一個效用函數。

有沒有這樣的東西去除一個值? ES6非常受歡迎。

非常感謝!

+0

沒有任何意義。 「沒有突變的對象中刪除值」。你不能從某些東西上移除並同時保持它完整。你實際做的是做一個副本。 – JJJ

回答

83

更新:

你可以從一個物體與一個棘手的Destructuring assignment刪除屬性:

const doSomething = (obj, prop) => { 
    let {[prop]: omit, ...res} = obj 
    return res 
} 

不過,如果你想刪除的屬性名稱是靜態的,那麼你可以用一個簡單的刪除一個班輪:

let {lastname, ...o2} = o 

最簡單的方法很簡單,就是或者你可以變異它之前克隆你的對象:

const doSomething = (obj, prop) => { 
    let res = Object.assign({}, obj) 
    delete res[prop] 
    return res 
} 

另外,您可以使用omit function from lodash utility library

let o2 = _.omit(o, 'lastname') 

它可以作爲lodash包的一部分,或作爲獨立lodash.omit包。

+2

這真的是最簡單的解決方案嗎?例如。對於數組,您可以使用'a2 = a1.filter(el => el.id!== id)'通過特定的ID省略數組中的元素。對於一個物體沒有這種東西嗎? – amann

+0

我同意@amann。無論哪個*都是更好的解決方案,或者ES6真的錯過了讓JS以更實用的方式可用的問題。例如。 Ruby有['keep_if'](http://apidock.com/ruby/Hash/keep_if) –

+1

@AugustinRiedinger實際上,有一種方法。查看我的更新。 –

2

正如上面評論中所建議的,如果您想擴展該功能以從object中移除多個項目,我喜歡使用filter。和reduce

const o = { 
 
     "firstname": "Jane", 
 
     "lastname": "Doe", 
 
     "middlename": "Kate", 
 
     "age": 23, 
 
     "_id": "599ad9f8ebe5183011f70835", 
 
     "index": 0, 
 
     "guid": "1dbb6a4e-f82d-4e32-bb4c-15ed783c70ca", 
 
     "isActive": true, 
 
     "balance": "$1,510.89", 
 
     "picture": "http://placehold.it/32x32", 
 
     "eyeColor": "green", 
 
     "registered": "2014-08-17T09:21:18 -10:00", 
 
     "tags": [ 
 
     "consequat", 
 
     "ut", 
 
     "qui", 
 
     "nulla", 
 
     "do", 
 
     "sunt", 
 
     "anim" 
 
     ] 
 
    }; 
 

 
    const removeItems = ['balance', 'picture', 'tags'] 
 
    console.log(formatObj(o, removeItems)) 
 

 
    function formatObj(obj, removeItems) { 
 
     return { 
 
     ...Object.keys(obj) 
 
      .filter(item => !isInArray(item, removeItems)) 
 
      .reduce((newObj, item) => { 
 
      return { 
 
       ...newObj, [item]: obj[item] 
 
      } 
 
      }, {}) 
 
     } 
 
    } 
 

 
    function isInArray(value, array) { 
 
     return array.indexOf(value) > -1; 
 
    }

相關問題