JavaScriptオブジェクトからプロパティを削除するにはどうすればよいですか?

6358
johnstok 2008-10-17 00:57.

次のようにオブジェクトを作成するとします。

let myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

次のように、プロパティregexを削除して新しいmyObjectものにするための最良の方法は何ですか?

let myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI"
};

28 answers

8558
nickf 2008-10-17 00:58.

このような:

delete myObject.regex;
// or,
delete myObject['regex'];
// or,
var prop = "regex";
delete myObject[prop];

デモ

var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};
delete myObject.regex;

console.log(myObject);

それについてもっと読むことに興味がある人のために、Stack Overflowユーザーkangaxはdelete、彼らのブログ、Understandingdeleteのステートメントについて信じられないほど詳細なブログ投稿を書いています。強くお勧めします。

981
Dan 2014-02-13 07:48.

JavaScriptのオブジェクトは、キーと値の間のマップと考えることができます。deleteオペレータは、より一般的にオブジェクトのプロパティを1つずつとしても知られているこれらのキーを削除するために使用されます。

var obj = {
  myProperty: 1    
}
console.log(obj.hasOwnProperty('myProperty')) // true
delete obj.myProperty
console.log(obj.hasOwnProperty('myProperty')) // false

delete演算子はメモリを直接解放しません。また、プロパティ自体がオブジェクトから削除されるという点で、プロパティの値nullまたはundefinedプロパティへの値の割り当てとは異なります。場合ことを注意、それに対するすべての参照を持っているまで削除財産のが参照型(オブジェクト)、およびプログラムの別の部分だった今でも、そのオブジェクトへの参照を保持しているが、そのオブジェクトは、もちろん、ないゴミが収集されます消えた。

delete 記述子が構成可能としてマークしているプロパティでのみ機能します。

264
redsquare 2008-10-17 01:03.

var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
    
delete myObject.regex;

console.log ( myObject.regex); // logs: undefined

これはFirefoxとInternetExplorerで機能し、他のすべてでも機能すると思います。

236
Braden Best 2012-09-18 14:56.

deleteオペレータは、オブジェクトからプロパティを除去するために使用されます。

const obj = { foo: "bar" }
delete obj.foo
obj.hasOwnProperty("foo") // false

配列の場合、これは要素を削除することと同じではないことに注意してください。配列から要素を削除するには、Array#spliceまたはを使用しますArray#pop。例えば:

arr // [0, 1, 2, 3, 4]
arr.splice(3,1); // 3
arr // [0, 1, 2, 4]

詳細

deleteJavaScriptでは、CおよびC ++のキーワードとは異なる機能があります。つまり、メモリを直接解放しません。代わりに、その唯一の目的は、オブジェクトからプロパティを削除することです。

配列の場合、インデックスに対応するプロパティを削除すると、スパース配列(つまり、「穴」が含まれる配列)が作成されます。ほとんどのブラウザは、これらの欠落している配列インデックスを「空」として表します。

var array = [0, 1, 2, 3]
delete array[2] // [0, 1, empty, 3]

delete再配置array[3]されないことに注意してくださいarray[2]

JavaScriptのさまざまな組み込み関数は、スパース配列の処理方法が異なります。

  • for...in 空のインデックスを完全にスキップします。

  • 従来のforループはundefined、インデックスの値を返します。

  • を使用Symbol.iteratorするメソッドはすべてundefined、インデックスの値を返します。

  • forEachmapおよびreduce単に欠落しているインデックスをスキップします。

したがって、このdelete演算子は、配列から要素を削除する一般的なユースケースには使用しないでください。配列には、要素を削除してメモリを再割り当てするための専用のメソッドがArray#splice()ありArray#popます。

Array#splice(start [、deleteCount [、item1 [、item2 [、...]]]])

Array#splice配列を変更し、削除されたインデックスを返します。deleteCount要素がインデックスから除去されstart、そしてitem1, item2... itemNインデックスから配列に挿入されますstartdeleteCount省略した場合、startIndexの要素は配列の最後に削除されます。

let a = [0,1,2,3,4]
a.splice(2,2) // returns the removed elements [2,3]
// ...and `a` is now [0,1,4]

同様に名前が付けられていますが、異なる関数がArray.prototype:にありArray#sliceます。

Array#slice([begin [、end]])

Array#sliceは非破壊的であり、からstartへの指定されたインデックスを含む新しい配列を返しますendendが指定されていない場合、デフォルトで配列の最後になります。endが正の場合、停止するゼロベースの非包括的インデックスを指定します。endが負の場合は、配列の最後からカウントバックして停止するインデックスを指定します(たとえば、-1は最後のインデックスを省略します)。の場合end <= start、結果は空の配列になります。

let a = [0,1,2,3,4]
let slices = [
    a.slice(0,2),
    a.slice(2,2),
    a.slice(2,3),
    a.slice(2,5) ]

//   a           [0,1,2,3,4]
//   slices[0]   [0 1]- - -   
//   slices[1]    - - - - -
//   slices[2]    - -[3]- -
//   slices[3]    - -[2 4 5]

Array#pop

Array#pop配列から最後の要素を削除し、その要素を返します。この操作により、配列の長さが変更されます。

226
Koen. 2016-11-09 08:02.

古い質問、現代の答え。ECMAScript 6の機能であるオブジェクトの破棄を使用すると、次のように簡単になります。

const { a, ...rest } = { a: 1, b: 2, c: 3 };

または質問のサンプルを使用して:

const myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
const { regex, ...newObject } = myObject;
console.log(newObject);

Babelトライアウトエディタで実際の動作を確認できます。


編集:

同じ変数に再割り当てするには、let:を使用します。

let myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
({ regex, ...myObject } = myObject);
console.log(myObject);
151
Lior Elrom 2018-09-13 08:39.

スプレッド構文(ES6)

それを必要とする人に...

このスレッドで@Koenの回答を完了するには、spread構文を使用して動的変数を削除する場合、次のように実行できます。

const key = 'a';
        
const { [key]: foo, ...rest } = { a: 1, b: 2, c: 3 };

console.log(foo);  // 1
console.log(rest); // { b: 2, c: 3 }

*fooa(1)の値を持つ新しい変数になります。


EXTENDED ANSWERは😇
オブジェクトからプロパティを削除するには、いくつかの一般的な方法があります。
それぞれに独自の長所と短所があります(このパフォーマンス比較を確認してください):

Delete Operator
読み取り可能で短いですが、パフォーマンスが最適化されていないため、多数のオブジェクトを操作している場合は、最適な選択ではない可能性があります。

delete obj[key];


再割り当て
は2倍以上高速ですdeleteが、プロパティは削除され、繰り返すことができます。

obj[key] = null;
obj[key] = false;
obj[key] = undefined;


Spread演算子
このES6演算子を使用すると、既存のオブジェクトを変更せずに、プロパティを除く新しいオブジェクトを返すことができます。欠点は、上記の中でパフォーマンスが低下することであり、一度に多くのプロパティを削除する必要がある場合に使用することはお勧めしません。

{ [key]: val, ...rest } = obj;
102
Thaddeus Albers 2014-05-25 08:53.

もう1つの方法は、Underscore.jsライブラリを使用することです。

_.pick()_.omit()両方がオブジェクトのコピーを返し、元のオブジェクトを直接変更しないことに注意してください。結果を元のオブジェクトに割り当てると、うまくいくはずです(図には示されていません)。

参照:link _.pick(object、* keys)

ホワイトリストに登録されたキー(または有効なキーの配列)の値のみを持つようにフィルタリングされた、オブジェクトのコピーを返します。

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.pick(myJSONObject, "ircEvent", "method");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

参照:link _.omit(object、* keys)

ブラックリストに登録されたキー(またはキーの配列)を省略するようにフィルタリングされた、オブジェクトのコピーを返します。

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.omit(myJSONObject, "regex");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

配列の場合、_.filter()および_.reject()同様の方法で使用できます。

58
Mehran Hatami 2014-02-12 20:29.

質問のタイトルRemove a property from a JavaScript objectで使用した用語は、いくつかの異なる方法で解釈できます。1つはメモリ全体でそれを削除し、オブジェクトキーのリストを削除するか、もう1つはオブジェクトから削除することです。他のいくつかの回答で言及されているように、deleteキーワードは主要部分です。次のようなオブジェクトがあるとします。

myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

もしあなたがそうするなら:

console.log(Object.keys(myJSONObject));

結果は次のようになります。

["ircEvent", "method", "regex"]

次のように、オブジェクトキーからその特定のキーを削除できます。

delete myJSONObject["regex"];

次に、使用Object.keys(myJSONObject)するオブジェクトキーは次のようになります。

["ircEvent", "method"]

ただし、メモリを気にし、オブジェクト全体をメモリから削除したい場合は、キーを削除する前にnullに設定することをお勧めします。

myJSONObject["regex"] = null;
delete myJSONObject["regex"];

ここでの他の重要なポイントは、同じオブジェクトへの他の参照に注意することです。たとえば、次のような変数を作成する場合:

var regex = myJSONObject["regex"];

または、次のような別のオブジェクトへの新しいポインタとして追加します。

var myOtherObject = {};
myOtherObject["regex"] = myJSONObject["regex"];

そうすれば、オブジェクトからそれを削除してもmyJSONObject、その特定のオブジェクトはメモリから削除されません。これは、regex変数がmyOtherObject["regex"]まだ値を持っているためです。では、どうすれば確実にメモリからオブジェクトを削除できますか?

答えは、コード内にあり、そのオブジェクト指しているすべての参照削除し、ステートメントを使用varしてそのオブジェクトへの新しい参照を作成しないことです。varステートメントに関するこの最後のポイントは、ステートメントを使用varすると作成されたオブジェクトが削除されなくなるため、通常直面する最も重要な問題の1つです。

つまり、この場合regexvarステートメントを介して変数を作成したため、そのオブジェクトを削除することはできません。

delete regex; //False

結果はになりますfalse。これは、削除ステートメントが期待どおりに実行されなかったことを意味します。ただし、以前にその変数を作成したことがなくmyOtherObject["regex"]、最後の既存の参照としてしか作成していない場合は、次のように削除するだけでこれを実行できます。

myOtherObject["regex"] = null;
delete myOtherObject["regex"];

つまり、JavaScriptオブジェクトは、そのオブジェクトを指す参照がコードに残っていない場合、すぐに強制終了されます。


更新: @AgentMEに感謝します:

プロパティを削除する前にnullに設定しても、何も実行されません(オブジェクトがObject.sealによってシールされていて、削除が失敗した場合を除きます。特に試してみない限り、通常はそうではありません)。

詳細情報を取得するにはObject.seal:Object.seal()

46
madox2 2016-01-11 06:36.

ECMAScript 2015(またはES6)には、組み込みのReflectオブジェクトが付属しています。ターゲットオブジェクトとプロパティキーをパラメータとしてReflect.deleteProperty()関数を呼び出すことにより、オブジェクトプロパティを削除できます。

Reflect.deleteProperty(myJSONObject, 'regex');

これは次と同等です:

delete myJSONObject['regex'];

ただし、オブジェクトのプロパティを構成できない場合は、deleteProperty関数でも削除演算子でも削除できません。

let obj = Object.freeze({ prop: "value" });
let success = Reflect.deleteProperty(obj, "prop");
console.log(success); // false
console.log(obj.prop); // value

Object.freeze()は、オブジェクトのすべてのプロパティを構成できないようにします(他のものを除く)。deleteProperty関数(および削除演算子)はfalse、そのプロパティのいずれかを削除しようとすると戻ります。プロパティが構成可能であるtrue場合、プロパティが存在しない場合でも、を返します。

deleteとはdeleteProperty、厳密なモードを使用する場合です。

"use strict";

let obj = Object.freeze({ prop: "value" });
Reflect.deleteProperty(obj, "prop"); // false
delete obj["prop"];
// TypeError: property "prop" is non-configurable and can't be deleted
44
John Slegers 2016-02-22 08:09.

次のようなオブジェクトがあるとします。

var Hogwarts = {
    staff : [
        'Argus Filch',
        'Filius Flitwick',
        'Gilderoy Lockhart',
        'Minerva McGonagall',
        'Poppy Pomfrey',
        ...
    ],
    students : [
        'Hannah Abbott',
        'Katie Bell',
        'Susan Bones',
        'Terry Boot',
        'Lavender Brown',
        ...
    ]
};

オブジェクトプロパティの削除

staff配列全体を使用する場合、これを行う適切な方法は、次のようにすることです。

delete Hogwarts.staff;

または、これを行うこともできます。

delete Hogwarts['staff'];

同様に、students配列全体を削除するには、delete Hogwarts.students;またはを呼び出しdelete Hogwarts['students'];ます。

配列インデックスの削除

ここで、1人のスタッフまたは学生を削除する場合、両方のプロパティ自体が配列であるため、手順が少し異なります。

スタッフのインデックスがわかっている場合は、次のようにするだけです。

Hogwarts.staff.splice(3, 1);

インデックスがわからない場合は、インデックス検索も行う必要があります。

Hogwarts.staff.splice(Hogwarts.staff.indexOf('Minerva McGonnagall') - 1, 1);

注意

技術的にはdelete配列に使用できますが、それを使用すると、たとえばHogwarts.staff.length後で呼び出すときに誤った結果が得られます。つまり、delete要素は削除されますが、lengthプロパティの値は更新されません。を使用deleteすると、インデックス作成も混乱します。

したがって、オブジェクトから値を削除するときは、常に最初にオブジェクトプロパティを扱っているのか、配列値を扱っているのかを検討し、それに基づいて適切な戦略を選択してください。

これを試してみたい場合は、このフィドルを出発点として使用できます。

36
YairTawil 2019-05-08 10:35.

プロパティなしでオブジェクトを複製するには:

例えば:

let object = { a: 1, b: 2, c: 3 };   

そして、を削除する必要がありaます。

  1. 明示的な小道具キー
    const { a, ...rest } = object;
    object = rest;
  1. 可変プロップキー
    const propKey = 'a';
    const { [propKey]: propValue, ...rest } = object;
    object = rest;
  1. クールな矢印機能😎:
    const removePropery = (propKey, { [propKey]: propValue, ...rest }) => rest;

    object = removePropery('a', object);
  1. 以下のための複数のプロパティ
    const removeProperties = (object, ...keys) => Object.entries(object).reduce((prev, [key, value]) => ({...prev, ...(!keys.includes(key) && { [key]: value }) }), {})

使用法

object = removeProperties(object, 'a', 'b') // result => { c: 3 }

または

    const propsToRemove = ['a', 'b']
    object = removeProperties(object, ...propsToRemove) // result => { c: 3 }
34
emil 2016-01-22 16:29.

私は個人的にUnderscore.jsまたはLodashをオブジェクトと配列の操作に使用しています。

myObject = _.omit(myObject, 'regex');
28
Alireza 2017-04-08 06:16.

MDNの説明に従って、deleteメソッドを使用するのが最善の方法です。削除演算子は、オブジェクトからプロパティを削除します。だからあなたは簡単に書くことができます:

delete myObject.regex;
// OR
delete myObject['regex'];

削除演算子は、指定されたプロパティをオブジェクトから削除します。削除が成功するとtrueが返され、そうでない場合はfalseが返されます。ただし、次のシナリオを考慮することが重要です。

  • 削除しようとしているプロパティが存在しない場合、deleteは効果がなく、trueを返します。

  • 同じ名前のプロパティがオブジェクトのプロトタイプチェーンに存在する場合、削除後、オブジェクトはプロトタイプチェーンのプロパティを使用します(つまり、削除は自身のプロパティにのみ影響します)。

  • varで宣言されたプロパティは、グローバルスコープまたは関数のスコープから削除できません。

  • そのため、deleteは、グローバルスコープ内の関数を削除できません(これが関数定義または関数(式)の一部であるかどうかに関係なく)。

  • オブジェクトの一部(
    グローバルスコープを除く)の関数は、deleteを使用して削除できます。

  • letまたはconstで宣言されたプロパティは、それらが定義されたスコープから削除できません。構成不可能なプロパティは削除できません。これには、Math、Array、Objectなどの組み込みオブジェクトのプロパティと、Object.defineProperty()などのメソッドで構成不可能として作成されたプロパティが含まれます。

次のスニペットは、別の簡単な例を示しています。

var Employee = {
      age: 28,
      name: 'Alireza',
      designation: 'developer'
    }
    
    console.log(delete Employee.name);   // returns true
    console.log(delete Employee.age);    // returns true
    
    // When trying to delete a property that does 
    // not exist, true is returned 
    console.log(delete Employee.salary); // returns true

詳細と例については、以下のリンクをご覧ください。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

25
kind user 2017-03-27 05:19.

を使用した別の解決策Array#reduce

var myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

myObject = Object.keys(myObject).reduce(function(obj, key) {
  if (key != "regex") {           //key you want to remove
    obj[key] = myObject[key];
  }
  return obj;
}, {});

console.log(myObject);

しかし、それはなり変異させ、元のオブジェクトを。指定されたキーなしで新しいオブジェクトを作成する場合は、reduce関数を新しい変数に割り当てるだけです。例:

(ES6)

const myObject = {
  ircEvent: 'PRIVMSG',
  method: 'newURI',
  regex: '^http://.*',
};

const myNewObject = Object.keys(myObject).reduce((obj, key) => {
  key !== 'regex' ? obj[key] = myObject[key] : null;
  return obj;
}, {});

console.log(myNewObject);

22
Willem 2014-09-15 14:48.

ここには良い答えがたくさんありますが、JavaScriptで削除を使用してプロパティを削除するときは、エラーを防ぐためにそのプロパティが存在するかどうかを最初に確認するのが賢明です。

例えば

var obj = {"property":"value", "property2":"value"};

if (obj && obj.hasOwnProperty("property2")) {
  delete obj.property2;
} else {
  //error handling
}

JavaScriptの動的な性質により、プロパティが存在するかどうかがわからない場合がよくあります。&&の前にobjが存在するかどうかを確認すると、未定義のオブジェクトでhasOwnProperty()関数を呼び出したためにエラーがスローされないことも確認できます。

これが特定のユースケースに追加されなかった場合は申し訳ありませんが、これはオブジェクトとそのプロパティを管理するときに適応するための優れた設計であると思います。

22
talsibony 2014-12-01 21:33.

この投稿は非常に古く、非常に役立つと思います。他の誰かがこの投稿を見て、PHPのunset関数ほど単純ではない理由を考える場合に備えて、私が書いたunset関数を共有することにしました。

この新しいunset関数を作成する理由は、このhash_map内の他のすべての変数のインデックスを保持するためです。次の例を見て、hash_mapから値を削除した後、「test2」のインデックスがどのように変更されなかったかを確認してください。

function unset(unsetKey, unsetArr, resort){
  var tempArr = unsetArr;
  var unsetArr = {};
  delete tempArr[unsetKey];
  if(resort){
    j = -1;
  }
  for(i in tempArr){
    if(typeof(tempArr[i]) !== 'undefined'){
      if(resort){
        j++;
      }else{
        j = i;
      }
      unsetArr[j] = tempArr[i];
    }
  }
  return unsetArr;
}

var unsetArr = ['test','deletedString','test2'];

console.log(unset('1',unsetArr,true)); // output Object {0: "test", 1: "test2"}
console.log(unset('1',unsetArr,false)); // output Object {0: "test", 2: "test2"}
17
Amio.io 2016-11-29 05:14.

ramda#dissocを使用すると、属性のない新しいオブジェクトを取得できますregex

const newObject = R.dissoc('regex', myObject);
// newObject !== myObject

他の機能を使用して同じ効果を実現することもできます-省略、選択、...

16
Mohammed Safeer 2016-07-07 04:51.

次の方法を試してください。Objectプロパティ値をに割り当てますundefined。次にstringify、オブジェクトとparse

 var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

myObject.regex = undefined;
myObject = JSON.parse(JSON.stringify(myObject));

console.log(myObject);

13
ayushgp 2016-06-23 23:38.

オブジェクトに深くネストされたプロパティを削除する場合は、2番目の引数としてプロパティへのパスを指定して次の再帰関数を使用できます。

var deepObjectRemove = function(obj, path_to_key){
    if(path_to_key.length === 1){
        delete obj[path_to_key[0]];
        return true;
    }else{
        if(obj[path_to_key[0]])
            return deepObjectRemove(obj[path_to_key[0]], path_to_key.slice(1));
        else
            return false;
    }
};

例:

var a = {
    level1:{
        level2:{
            level3: {
                level4: "yolo"
            }
        }
    }
};

deepObjectRemove(a, ["level1", "level2", "level3"]);
console.log(a);

//Prints {level1: {level2: {}}}
9
Chong Lip Phang 2017-07-26 21:19.

「削除」というダンの主張は非常に遅く、彼が投稿したベンチマークは疑わしいものでした。そこで、Chrome59で自分でテストを実行しました。「削除」は約30倍遅いようです。

var iterationsTotal = 10000000;  // 10 million
var o;
var t1 = Date.now(),t2;
for (let i=0; i<iterationsTotal; i++) {
   o = {a:1,b:2,c:3,d:4,e:5};
   delete o.a; delete o.b; delete o.c; delete o.d; delete o.e;
}
console.log ((t2=Date.now())-t1);  // 6135
for (let i=0; i<iterationsTotal; i++) {
   o = {a:1,b:2,c:3,d:4,e:5};
   o.a = o.b = o.c = o.d = o.e = undefined;
}
console.log (Date.now()-t2);  // 205

他の操作による影響を最小限に抑えるために、1つのループサイクルで意図的に複数の「削除」操作を実行したことに注意してください。

9
james_womack 2017-12-14 16:35.

JavaScriptでのプロパティの削除

このページにはさまざまなオプションが表示されますが、これはほとんどのオプションが間違っているため、または回答が重複しているためではなく、適切な手法が現在の状況やタスクの目標によって異なるためです。チームは達成しようとしています。質問に明確に答えるには、次のことを知っておく必要があります。

  1. ターゲットにしているECMAScriptのバージョン
  2. プロパティを削除するオブジェクトタイプの範囲と省略できるプロパティ名のタイプ(文字列のみ?シンボル?任意のオブジェクトからマップされた弱い参照?これらはすべて、JavaScriptのプロパティポインタのタイプです。 )
  3. あなたとあなたのチームが使用するプログラミングの精神/パターン。あなたは機能的なアプローチを好み、突然変異はあなたのチームで冗長になっていますか、それとも野生の西の突然変異オブジェクト指向技術を採用していますか?
  4. 純粋なJavaScriptでこれを実現しようとしていますか、それともサードパーティのライブラリを使用する意思と能力がありますか?

これらの4つのクエリに回答すると、JavaScriptには基本的に4つのカテゴリの「プロパティの削除」があり、目標を達成するために選択できます。彼らです:

変異オブジェクトプロパティの削除、安全ではありません

このカテゴリは、元の参照を保持/継続して使用し、コードでステートレス関数型の原則を使用していない場合に、オブジェクトリテラルまたはオブジェクトインスタンスを操作するためのものです。このカテゴリの構文の例:

'use strict'
const iLikeMutatingStuffDontI = { myNameIs: 'KIDDDDD!', [Symbol.for('amICool')]: true }
delete iLikeMutatingStuffDontI[Symbol.for('amICool')] // true
Object.defineProperty({ myNameIs: 'KIDDDDD!', 'amICool', { value: true, configurable: false })
delete iLikeMutatingStuffDontI['amICool'] // throws

このカテゴリは、最も古く、最も単純で、最も広くサポートされているプロパティ削除のカテゴリです。Symbol文字列に加えてインデックスと配列インデックスをサポートし、最初のリリースを除くすべてのバージョンのJavaScriptで機能します。ただし、これは一部のプログラミング原則に違反し、パフォーマンスに影響を与える変異型です。また、strictモードで構成不可能なプロパティで使用すると、キャッチされない例外が発生する可能性があります。

RESTベースの文字列プロパティの省略

このカテゴリは、非変更アプローチが必要で、シンボルキーを考慮する必要がない場合に、新しいECMAScriptフレーバーのプレーンオブジェクトまたは配列インスタンスを操作するためのものです。

const foo = { name: 'KIDDDDD!', [Symbol.for('isCool')]: true }
const { name, ...coolio } = foo // coolio doesn't have "name"
const { isCool, ...coolio2 } = foo // coolio2 has everything from `foo` because `isCool` doesn't account for Symbols :(

変異オブジェクトプロパティの削除、安全

このカテゴリは、構成不可能なプロパティで例外がスローされるのを防ぎながら、元の参照を保持/継続して使用する場合に、オブジェクトリテラルまたはオブジェクトインスタンスを操作するためのものです。

'use strict'
const iLikeMutatingStuffDontI = { myNameIs: 'KIDDDDD!', [Symbol.for('amICool')]: true }
Reflect.deleteProperty(iLikeMutatingStuffDontI, Symbol.for('amICool')) // true
Object.defineProperty({ myNameIs: 'KIDDDDD!', 'amICool', { value: true, configurable: false })
Reflect.deleteProperty(iLikeMutatingStuffDontI, 'amICool') // false

さらに、オブジェクトをインプレースで変更することはステートレスではありませんが、の機能的性質を使用して、ステートメントReflect.deletePropertyでは不可能な部分適用やその他の機能的手法を実行できdeleteます。

構文ベースの文字列プロパティの省略

このカテゴリは、非変更アプローチが必要で、シンボルキーを考慮する必要がない場合に、新しいECMAScriptフレーバーのプレーンオブジェクトまたは配列インスタンスを操作するためのものです。

const foo = { name: 'KIDDDDD!', [Symbol.for('isCool')]: true }
const { name, ...coolio } = foo // coolio doesn't have "name"
const { isCool, ...coolio2 } = foo // coolio2 has everything from `foo` because `isCool` doesn't account for Symbols :(

ライブラリベースのプロパティの省略

このカテゴリでは、通常、シンボルの説明や1つのステートメントでの複数のプロパティの省略など、機能の柔軟性を高めることができます。

const o = require("lodash.omit")
const foo = { [Symbol.for('a')]: 'abc', b: 'b', c: 'c' }
const bar = o(foo, 'a') // "'a' undefined"
const baz = o(foo, [ Symbol.for('a'), 'b' ]) // Symbol supported, more than one prop at a time, "Symbol.for('a') undefined"
8
johndavedecano 2017-09-15 04:14.

lodashを使用する

import omit from 'lodash/omit';

const prevObject = {test: false, test2: true};
// Removes test2 key from previous object
const nextObject = omit(prevObject, 'test2');

ラムダの使用

R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}
8
Noname 2017-09-19 22:37.

Object.assign()&Object.keys()&Array.map()

const obj = {
    "Filters":[
        {
            "FilterType":"between",
            "Field":"BasicInformationRow.A0",
            "MaxValue":"2017-10-01",
            "MinValue":"2017-09-01",
            "Value":"Filters value"
        }
    ]
};

let new_obj1 = Object.assign({}, obj.Filters[0]);
let new_obj2 = Object.assign({}, obj.Filters[0]);

/*

// old version

let shaped_obj1 = Object.keys(new_obj1).map(
    (key, index) => {
        switch (key) {
            case "MaxValue":
                delete new_obj1["MaxValue"];
                break;
            case "MinValue":
                delete new_obj1["MinValue"];
                break;
        }
        return new_obj1;
    }
)[0];


let shaped_obj2 = Object.keys(new_obj2).map(
    (key, index) => {
        if(key === "Value"){
            delete new_obj2["Value"];
        }
        return new_obj2;
    }
)[0];


*/


// new version!

let shaped_obj1 = Object.keys(new_obj1).forEach(
    (key, index) => {
        switch (key) {
            case "MaxValue":
                delete new_obj1["MaxValue"];
                break;
            case "MinValue":
                delete new_obj1["MinValue"];
                break;
            default:
                break;
        }
    }
);

let shaped_obj2 = Object.keys(new_obj2).forEach(
    (key, index) => {
        if(key === "Value"){
            delete new_obj2["Value"];
        }
    }
);

7
hygull 2018-05-25 08:42.

@ johnstock、JavaScriptのプロトタイピングの概念を使用して、オブジェクトにメソッドを追加し、オブジェクトの呼び出しで使用可能な渡されたキーを削除することもできます。

上記の回答をいただければ幸いです。

var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};

// 1st and direct way 
delete myObject.regex;  // delete myObject["regex"]
console.log(myObject); // { ircEvent: 'PRIVMSG', method: 'newURI' }

 // 2 way -  by using the concept of JavaScript's prototyping concept
Object.prototype.removeFromObjectByKey = function(key) {
     // If key exists, remove it and return true
     if(this[key] !== undefined) {
           delete this[key]
           return true;
     }
     // Else return false
     return false;
}

var isRemoved = myObject.removeFromObjectByKey('method')
console.log(myObject)  // { ircEvent: 'PRIVMSG' }

// More examples
var obj = { a: 45, b: 56, c: 67}
console.log(obj) // { a: 45, b: 56, c: 67 }

// Remove key 'a' from obj
isRemoved = obj.removeFromObjectByKey('a')
console.log(isRemoved); //true
console.log(obj); // { b: 56, c: 67 }

// Remove key 'd' from obj which doesn't exist
var isRemoved = obj.removeFromObjectByKey('d')
console.log(isRemoved); // false
console.log(obj); // { b: 56, c: 67 }
6
king neo 2019-09-19 00:59.

以下のようなフィルターを使用できます

var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};

// way 1

let filter1 = {}
  Object.keys({...myObject}).filter(d => {
  if(d !== 'regex'){
    filter1[d] = myObject[d];
  }
})

console.log(filter1)

// way 2

let filter2 = Object.fromEntries(Object.entries({...myObject}).filter(d => 
d[0] !== 'regex'
))

console.log(filter2)

5
BEJGAM SHIVA PRASAD 2017-09-29 22:03.

ネストされたオブジェクトでも発生するように、lodash "unset"を使用しました。これだけで、omitメソッドで予期されるプロパティキーのパスを取得するための小さなロジックを作成する必要があります。

  1. プロパティパスを配列として返すメソッド

var a = {"bool":{"must":[{"range":{"price_index.final_price":{"gt":"450","lt":"500"}}},{"bool":{"should":[{"term":{"color_value.keyword":"Black"}}]}}]}};

function getPathOfKey(object,key,currentPath, t){
     var currentPath = currentPath || [];

    for(var i in object){
		if(i == key){
        t = currentPath;
      }
      else if(typeof object[i] == "object"){
        currentPath.push(i)
       return getPathOfKey(object[i], key,currentPath)
      }
    }
	t.push(key);
    return t;
}
document.getElementById("output").innerHTML =JSON.stringify(getPathOfKey(a,"price_index.final_price"))
<div id="output"> 

</div>

  1. 次に、lodash unsetメソッドを使用して、オブジェクトからプロパティを削除します。

var unset = require('lodash.unset');
unset(a,getPathOfKey(a,"price_index.final_price"));

3
bluejayke 2020-09-16 19:56.

let myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};


obj = Object.fromEntries(
    Object.entries(myObject).filter(function (m){
        return m[0] != "regex"/*or whatever key to delete*/
    }
))

console.log(obj)

a2dを使用してオブジェクトを配列のように扱い、Object.entriesスプライスを使用して通常の配列の場合と同じように要素を削除するか、配列のようにオブジェクトを単純にフィルタリングして、再構築されたオブジェクトを元の変数に割り当てることもできます。

1
Vahid Akhtar 2020-11-17 18:37.

元のオブジェクトを変更したくない場合。

オブジェクトを変更せずにプロパティを削除する

可変性が懸念される場合は、削除するプロパティを除いて、古いプロパティからすべてのプロパティをコピーすることで、完全に新しいオブジェクトを作成できます。

let myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

let prop = 'regex';
const updatedObject = Object.keys(myObject).reduce((object, key) => {
  if (key !== prop) {
    object[key] = myObject[key]
  }
  return object
}, {})

console.log(updatedObject);

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

今週のコミックコンですべての素晴らしいものに追いつく方法

今週のコミックコンですべての素晴らしいものに追いつく方法

サンディエゴコミックコンは今週開幕し、オタクのアナウンス、ポスター、予告編、お気に入りの番組や映画のからかいでいっぱいになります。SDCCは、コンベンションフロア全体の多くのパネルで行われているため、すべてに対応するのは難しい場合があります。

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

小さなアプリ開発者は金曜日に発表された法的な和解でグーグルから9千万ドルをこじ開けた。アップルとの同様の合意に続いて熱くなった。金曜日のブログ投稿で、Googleは、Androidメーカーが市場での優位性を悪用してPlayストア経由でのアプリ内購入に対して30%の料金を不当に請求したと主張するアプリ開発者との訴訟を解決するために、9千万ドルを支払うことに合意したと述べました。

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

今週、RadioShackのTwitterアカウントは、奇妙なものから完全にひどいものになりました。短い順序で、会社のフィード全体が、バイブレーター、「ビッグティット」(スペルミス)、有名人やその他の企業アカウントを荒らしているツイートなど、NSFW素材の真の山になりました。

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

大型ハドロン衝突型加速器のトンネル内にあるコンパクトミュオンソレノイド(CMS)検出器。2012年7月4日、CERNの科学者たちは、1960年代に最初に提案された素粒子であるヒッグス粒子の観測を確認しました。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Un breve viaje espacial sobre conceptualizar el diseño

Complicarse la vida, mezclar churros con meninas (nada de ovejas) y encontrar valor en un trastero que adquiriste en una puja.

Un breve viaje espacial sobre conceptualizar el diseño

Bien. Hay un momento en toda salida al espacio exterior en el que de la tensión, la velocidad y las altas temperaturas derivadas del cruce de estratosfera a ionosfera se pasa a un momento de súbita calma, donde se despliega la vista completa del paisaje espacial que nos rodea.

Seguindo Todos os Protocolos (2022), de Fábio Leal

Seguindo Todos os Protocolos (2022), de Fábio Leal

Chico quer transar. Até aí, tudo bem.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

Language