2015-10-10 42 views
35

Özgün nesneyi dönüştürmeden belirli bir anahtardaki bir nesneyi bir değerden silmek için iyi ve kısa bir yol nedir?Değeri değiştirmeden nesneyi kaldırın

ben böyle bir şey yapmak istiyorum:

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

Böyle görevler için değişmezlik kütüphanelerinin bir yeri vardır biliyorum ama uzakta bir kütüphane olmadan almak istiyorum. Ancak bunu yapmak için, bir yöntem, bir yardımcı fonksiyon olarak metodu soyutlamadan, kod boyunca kullanılabilecek kolay ve kısa bir yol olmalıdır.

E.g. Bir değer eklemek için ben aşağıdakileri yapın:

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

Bu oldukça kısa hatırlamak ve bir yardımcı işlev gerekmez kolaydır.

Değeri kaldırmak için böyle bir şey var mı? ES6 çok hoş geldiniz.

Çok teşekkür ederim!

+0

herhangi bir anlam ifade etmez "nesne mutasyona olmadan değeri kaldırın". Bir şeyden çıkaramaz ve aynı zamanda sağlam tutamazsınız. Gerçekte yaptığınız şey kısmi bir kopyasını yapmak. – JJJ

cevap

83

Güncelleme: Bir zor Destructuring assignment ile bir nesnenin özelliği kaldırmak olabilir

:

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

kaldırmak istediğiniz özellik adı statik ise de, o zaman basit ile çıkarabilirim tek satırlık:

let {lastname, ...o2} = o 

en kolay yolu basitçe Yoksa onu mutasyona önce nesneyi klonlayacaklar:

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

Alternatif kullanabilirsiniz omit function from lodash utility library:

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

O lodash paketinin bir parçası olarak kullanılabilir, ya da tek başına bir lodash.omit paket olarak .

+2

Bu gerçekten en basit çözüm mü? Örneğin. diziler için bir dizi içinde belirli bir kimlik tarafından atlamak için a2 = a1.filter (el => el.id! == id) 'yapabilirsiniz. Bir nesne için böyle bir şey yok mu? – amann

+0

@amann ile aynı fikirdeyim. Ya * daha * daha iyi bir çözüm ya da ES6, JS'yi daha işlevsel bir şekilde kullanabilme konusunda gerçekten bir şeyleri kaçırdı. Örneğin. Ruby'de ['keep_if'] (http://apidock.com/ruby/Hash/keep_if) –

+1

@AugustinRiedinger'ın aslında bir yolu var. Güncellemeye bakın. –

2

objectfilter'u kullanmayı seviyorum. ve reduce

örn

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