元のオブジェクトを変更せずに特定のキーでオブジェクトから値を削除するための良い簡単な方法は何ですか?
私は次のようなことをしたいです:
let o = {firstname: 'Jane', lastname: 'Doe'};
let o2 = doSomething(o, 'lastname');
console.log(o.lastname); // 'Doe'
console.log(o2.lastname); // undefined
そのようなタスクのための不変性ライブラリがたくさんあることは知っていますが、ライブラリなしで逃げたいです。しかし、これを行うには、ユーティリティ関数としてメソッドを抽象化することなく、コード全体で使用できる簡単で短い方法が必要です。
例えば。値を追加するために、私は次のことを行います:
let o2 = {...o1, age: 31};
これは非常に短く、覚えやすく、ユーティリティ関数を必要としません。
値を削除するためにこのようなものはありますか? ES6は大歓迎です。
どうもありがとうございました!
あなたはトリッキーなオブジェクトからプロパティを削除できます 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
ユーティリティライブラリのlodash
関数を使用できます :
let o2 = _.omit(o, 'lastname')
lodash パッケージの一部として、またはスタンドアロンの lodash.omit パッケージとして利用可能です。
ES7オブジェクトの構造化により:
const myObject = {
a: 1,
b: 2,
c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }
ワンラインソリューション
const removeKey = (key, {[key]: _, ...rest}) => rest;
上記のコメントで示唆されているように、これを拡張して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;
}
lodash cloneDeepおよびdeleteを使用
(注:浅いオブジェクトの代わりにlodashクローンを使用できます)
const obj = {a: 1, b: 2, c: 3}
const unwantedKey = 'a'
const _ = require('lodash')
const objCopy = _.cloneDeep(obj)
delete objCopy[unwantedKey]
// objCopy = {b: 2, c: 3}