web-dev-qa-db-ja.com

突然変異なしでオブジェクトから値を削除

元のオブジェクトを変更せずに特定のキーでオブジェクトから値を削除するための良い簡単な方法は何ですか?

私は次のようなことをしたいです:

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は大歓迎です。

どうもありがとうございました!

72
amann

更新:

あなたはトリッキーなオブジェクトからプロパティを削除できます 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 パッケージとして利用可能です。

167

ES7オブジェクトの構造化により:

const myObject = {
  a: 1,
  b: 2,
  c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }
16
senbon

ワンラインソリューション

const removeKey = (key, {[key]: _, ...rest}) => rest;
13
punksta

上記のコメントで示唆されているように、これを拡張して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;
    }
3
ak85

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}
0
FFF