Hoe verwijder ik een eigenschap uit een JavaScript-object?

Stel dat ik een object als volgt maak:

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

Hoe moet ik de eigenschap regexverwijderen om als volgt te eindigen met het nieuwe myObject?

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

Antwoord 1, autoriteit 100%

Als u een eigenschap van een object wilt verwijderen (het object muteren), kunt u dit als volgt doen:

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

Demo

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

Antwoord 2, autoriteit 11%

Objecten in JavaScript kunnen worden gezien als kaarten tussen sleutels en waarden. De operator deletewordt gebruikt om deze sleutels, beter bekend als objecteigenschappen, één voor één te verwijderen.

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

Antwoord 3, autoriteit 3%

var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
delete myObject.regex;
console.log ( myObject.regex); // logs: undefined

Antwoord 4, autoriteit 3%

Oude vraag, modern antwoord. Het gebruik van objectdestructurering, een ECMAScript 6-functie, is zo simpel als:

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

Of met het voorbeeld van de vragen:

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

Je kunt het in actie zien in de Babel-proefeditor.


Bewerken:

Gebruik een letom opnieuw toe te wijzen aan dezelfde variabele:

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

Antwoord 5, autoriteit 3%

De operator deletewordt gebruikt om eigenschappen van objecten te verwijderen.

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

Merk op dat voor arrays dit niet hetzelfde is als het verwijderen van een element. Gebruik Array#spliceof Array#popom een element uit een array te verwijderen. Bijvoorbeeld:

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

Details

deletein JavaScript heeft een andere functie dan die van het trefwoord in C en C++: het maakt niet direct geheugen vrij. In plaats daarvan is het enige doel om eigenschappen van objecten te verwijderen.

Voor arrays, het verwijderen van een eigenschap die overeenkomt met een index, creëert een schaarse array (dwz een array met een “gat” erin). De meeste browsers geven deze ontbrekende array-indexen weer als “leeg”.

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

Houd er rekening mee dat deletearray[3]niet verplaatst naar array[2].

Verschillende ingebouwde functies in JavaScript gaan anders om met schaarse arrays.

  • for...inslaat de lege index volledig over.

  • Een traditionele for-lus retourneert undefinedvoor de waarde in de index.

  • Elke methode die Symbol.iteratorgebruikt, retourneert undefinedvoor de waarde in de index.

  • forEach, mapen reduceslaan de ontbrekende index gewoon over.

Dus de delete-operator mag niet worden gebruikt voor het algemene gebruik van het verwijderen van elementen uit een array. Arrays hebben speciale methoden voor het verwijderen van elementen en het opnieuw toewijzen van geheugen: Array#splice()en Array#pop.

Array#splice(start[, deleteCount[, item1[, item2[, …]]]])

Array#splicemuteert de array en retourneert eventuele verwijderde indices. deleteCountelementen worden verwijderd uit index start, en item1, item2... itemNworden ingevoegd in de array vanaf index start. Als deleteCountwordt weggelaten, worden elementen uit startIndex verwijderd naar het einde van de array.

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

Er is ook een gelijknamige, maar andere functie op Array.prototype: Array#slice.

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

Array#sliceis niet-destructief en retourneert een nieuwe array met de aangegeven indices van starttot end. Als endniet wordt opgegeven, wordt standaard het einde van de array gebruikt. Als endpositief is, specificeert het de op nul gebaseerde niet-inclusiveindex om te stoppen. Als endnegatief is, specificeert het de index om te stoppen door terug te tellen vanaf het einde van de array (bijv. -1 zal de uiteindelijke index weglaten). Als end <= start, is het resultaat een lege array.

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#popverwijdert het laatste element uit een array en retourneert dat element. Deze bewerking verandert de lengte van de array.


Antwoord 6, autoriteit 2%

Verspreid syntaxis(ES6)

Om Koens antwoord te voltooien, als u een dynamische variabele wilt verwijderen met behulp van de spread-syntaxis, kunt u dit als volgt doen:

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

Antwoord 7

Een ander alternatief is om de bibliotheek Underscore.jste gebruiken.

Merk op dat _.pick()en _.omit()beide een kopie van het object retourneren en het oorspronkelijke object niet rechtstreeks wijzigen. Het toewijzen van het resultaat aan het originele object zou voldoende moeten zijn (niet getoond).

Referentie: link_.pick(object, *keys)

Retourneer een kopie van het object, gefilterd om alleen waarden te hebben voor de
op de witte lijst geplaatste sleutels (of reeks geldige sleutels).

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
_.pick(myJSONObject, "ircEvent", "method");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

Referentie: link_.omit(object, *keys)

Retourneer een kopie van het object, gefilterd om de . weg te laten
sleutels op de zwarte lijst (of reeks sleutels).

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
_.omit(myJSONObject, "regex");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

Voor arrays kunnen _.filter()en _.reject()op een vergelijkbare manier worden gebruikt.


Antwoord 8

Een object klonen zonder eigenschap:

Bijvoorbeeld:

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

En we moeten averwijderen.

  1. Met een expliciete prop-sleutel:

    const { a, ...rest } = object;
    object = rest;
    
  2. Met een variabele prop-sleutel:

    const propKey = 'a';
    const { [propKey]: propValue, ...rest } = object;
    object = rest;
    
  3. Een coole pijlfunctie😎:

    const removeProperty = (propKey, { [propKey]: propValue, ...rest }) => rest;
     object = removeProperty('a', object);
    
  4. Voor meerdere woningen

    const removeProperties = (object, ...keys) => Object.entries(object).reduce((prev, [key, value]) => ({...prev, ...(!keys.includes(key) && { [key]: value }) }), {})
    

Gebruik

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

Of

   const propsToRemove = ['a', 'b']
    object = removeProperties(object, ...propsToRemove) // result => { c: 3 }

Antwoord 9

ECMAScript 2015 (of ES6) werd geleverd met ingebouwde Reflectvoorwerp. Het is mogelijk om de objecteigenschap te verwijderen door Reflect.deleteProperty()functie met doelobject en eigenschapssleutel als parameters:

Reflect.deleteProperty(myJSONObject, 'regex');

wat gelijk is aan:

delete myJSONObject['regex'];

Maar als de eigenschap van het object niet configureerbaar is, kan deze niet worden verwijderd met de functie deleteProperty of de operator delete:

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

Object.freeze()maakt alle eigenschappen van object niet configureerbaar (naast andere dingen). Functie deleteProperty(evenals delete-operator) retourneert falsewanneer wordt geprobeerd een van zijn eigenschappen te verwijderen. Als eigenschap configureerbaar is, wordt truegeretourneerd, zelfs als eigenschap niet bestaat.

Het verschil tussen deleteen deletePropertyis bij gebruik van de strikte modus:

"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

Antwoord 10

Stel dat je een object hebt dat er als volgt uitziet:

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

Een objecteigenschap verwijderen

Als u de hele staffarray wilt gebruiken, is de juiste manier om dit te doen, dit te doen:

delete Hogwarts.staff;

U kunt ook dit doen:

delete Hogwarts['staff'];

Op dezelfde manier zou het verwijderen van de hele studentenarray gedaan worden door delete Hogwarts.students;of delete Hogwarts['students'];aan te roepen.

Een array-index verwijderen

Als je nu een enkele medewerker of student wilt verwijderen, is de procedure een beetje anders, omdat beide eigenschappen zelf arrays zijn.

Als u de index van uw personeelslid kent, kunt u dit eenvoudig doen:

Hogwarts.staff.splice(3, 1);

Als u de index niet kent, moet u ook een indexzoekopdracht uitvoeren:

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

Opmerking

Hoewel je technisch gezien deletevoor een array kunt gebruiken, zou het gebruik ervan leiden tot onjuiste resultaten wanneer je later bijvoorbeeld Hogwarts.staff.lengthaanroept. Met andere woorden, deletezou het element verwijderen, maar de waarde van de eigenschap lengthniet bijwerken. Het gebruik van deletezou ook uw indexering in de war brengen.

Dus, wanneer u waarden uit een object verwijdert, moet u altijd eerst overwegen of u te maken heeft met objecteigenschappen of dat u te maken heeft met arraywaarden, en op basis daarvan de juiste strategie kiest.

Als u hiermee wilt experimenteren, kunt u deze viool als uitgangspunt gebruiken .


11

I Persoonlijk gebruik underscore.js of Lodash voor object en array manipulatie:

myObject = _.omit(myObject, 'regex');

12

Gebruik Delete Methode is de beste manier om dat te doen, volgens de MDN-beschrijving, de Delete Operator verwijdert een eigenschap van een object. Dus je kunt gewoon schrijven:

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

De Delete Operator verwijdert een gegeven eigenschap vanuit een object. Op
Succesvolle deletie, het zal true retourneren, anders is onwaar geretourneerd.
Het is echter belangrijk om de volgende scenario’s te overwegen:

  • Als de eigenschap die u probeert te verwijderen niet bestaat, verwijdert u niet
    Zal geen effect hebben en zal het true retourneren

  • Als een eigenschap met dezelfde naam bestaat op het prototype van het object
    ketting, dan, na het verwijderen, zal het object het eigendom van de
    Prototypeketting (met andere woorden, verwijder alleen een effect op eigen
    eigenschappen).

  • Elke eigenschap die is gedeclareerd, kan niet worden verwijderd uit de wereldwijde reikwijdte
    of van de reikwijdte van een functie.

  • Als zodanig kan verwijderen geen functies in de wereldwijde reikwijdte verwijderen (of dit deel uitmaakt van een functiedefinitie of een functie (expressie).

  • Functies die deel uitmaken van een object (afgezien van de
    Global Scope) kan worden verwijderd met Verwijderen.

  • Eigenschappen gedeclareerd met let of const kunnen niet worden verwijderd uit het bereik waarbinnen ze zijn gedefinieerd. Niet-configureerbare eigenschappen kunnen niet worden verwijderd. Dit omvat eigenschappen van ingebouwde objecten zoals Math, Array, Object en eigenschappen die zijn gemaakt als niet-configureerbaar met methoden zoals Object.defineProperty().

Het volgende fragment geeft nog een eenvoudig voorbeeld:

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

Antwoord 13

Een andere oplossing, met behulp van 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);

Antwoord 14

Er zijn hier een heleboel goede antwoorden, maar ik wil gewoon vasthouden aan dat wanneer u Delete gebruikt om een ​​woning in JavaScript te verwijderen, het is vaak verstandig om eerst te controleren of dat eigendom bestaat om fouten te voorkomen.

b.g

var obj = {"property":"value", "property2":"value"};
if (obj && obj.hasOwnProperty("property2")) {
  delete obj.property2;
} else {
  //error handling
}

Vanwege de dynamische aard van JavaScript zijn er vaak gevallen waarin u gewoon niet weet of het pand bestaat of niet. Controleren of OBJ bestaat vóór de & amp; & amp; Zorgt er ook voor dat u geen fout gooit als gevolg van het oproepen van de functie HasownProperty () op een ongedefinieerd object.

Sorry als dit niet voegde aan uw specifieke gebruikscase, maar ik geloof dat dit een goed ontwerp is om aan te passen bij het beheren van objecten en hun eigenschappen.


15

Dit bericht is erg oud en ik vind het erg behulpzaam, dus ik besloot om de unset-functie te delen die ik heb geschreven in het geval iemand anders deze post zie en denk waarom het niet zo eenvoudig is als het in PHP-functie.

De reden voor het schrijven van deze nieuwe unset-functie, is om de index van alle andere variabelen in deze HASH_MAP te houden. Kijk naar het volgende voorbeeld en zie hoe de index van “Test2” niet veranderde na het verwijderen van een waarde van de HASH_MAP.

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

16

Probeer de volgende methode. Wijs de Objectonroerend goed toe aan undefined. Dan stringifyHet object en de parse.

var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
myObject.regex = undefined;
myObject = JSON.parse(JSON.stringify(myObject));
console.log(myObject);

17

Als u een woning diep in het object wilt verwijderen, kunt u de volgende recursieve functie gebruiken met een pad naar de accommodatie als het tweede argument:

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

Voorbeeld:

var a = {
    level1:{
        level2:{
            level3: {
                level4: "yolo"
            }
        }
    }
};
deepObjectRemove(a, ["level1", "level2", "level3"]);
console.log(a);
//Prints {level1: {level2: {}}}

Antwoord 18

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"];
        }
    }
);

Antwoord 19

Hier is een ES6-manier om het item gemakkelijk te verwijderen:

let myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};
const removeItem = 'regex';
const { [removeItem]: remove, ...rest } = myObject;
console.log(remove); // "^http://.*"
console.log(rest); // Object { ircEvent: "PRIVMSG", method: "newURI" }

Antwoord 20

Eigenschappen verwijderen in JavaScript

Er zijn veel verschillende opties op deze pagina, niet omdat de meeste opties fout zijn – of omdat de antwoorden dubbel zijn – maar omdat de juiste techniek afhangt van de situatie waarin je je bevindt en de doelen van de taken die jij en /of je team probeert te vervullen. Om je vraag ondubbelzinnig te beantwoorden, moet je weten:

  1. De versie van ECMAScript die u target
  2. Het bereik van objecttypen waarvan u eigenschappen wilt verwijderen en het type eigenschapsnamen dat u moet kunnen weglaten (alleen tekenreeksen? Symbolen? Zwakke verwijzingen die zijn toegewezen aan willekeurige objecten? Dit zijn allemaal typen eigenschapsaanwijzers in JavaScript geweest al jaren)
  3. De programmeerethos/patronen die jij en je team gebruiken. Geeft u de voorkeur aan functionele benaderingen en is mutatie verboden in uw team, of gebruikt u wildwest-mutatieve objectgeoriënteerde technieken?
  4. Bent u op zoek om dit in puur JavaScript te bereiken of bent u bereid & kunt u een bibliotheek van derden gebruiken?

Zodra die vier vragen zijn beantwoord, zijn er in feite vier categorieën voor het verwijderen van eigendommen in JavaScript waaruit u kunt kiezen om uw doelen te bereiken. Dit zijn:

Verwijderen van muterende objecteigenschappen, onveilig

Deze categorie is bedoeld voor gebruik met letterlijke objecten of objectinstanties wanneer u de originele verwijzing wilt behouden/doorgaan en geen staatloze functionele principes in uw code gebruikt. Een voorbeeld van een syntaxis in deze categorie:

'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

Deze categorie is de oudste, meest eenvoudige & meest ondersteunde categorie van eigendomsverwijdering. Het ondersteunt Symbol& array indexen naast strings en werkt in elke versie van JavaScript behalve de allereerste release. Het is echter mutatief, wat in strijd is met sommige programmeerprincipes en gevolgen heeft voor de prestaties. Het kan ook resulteren in niet-afgevangen uitzonderingen bij gebruik op niet-configureerbare eigenschappen in strikte modus.

Op rust gebaseerde weglating van tekenreekseigenschap

Deze categorie is voor gebruik op gewone objecten of array-instanties in nieuwere ECMAScript-smaken wanneer een niet-mutatieve benadering gewenst is en u geen rekening hoeft te houden met symboolsleutels:

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 :(

Mutative Object Property Deletion, Safe

Deze categorie is voor het werken op objectliteraten of object-instanties wanneer u de oorspronkelijke referentie wilt behouden / blijven gebruiken tijdens het bewaken tegen uitzonderingen die worden gegooid op niet-geconfigureerde eigenschappen:

'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

Bovendien, terwijl u objecten in de plaats niet staat, kunt u de functionele aard van Reflect.deletePropertygebruiken om gedeeltelijke toepassing en andere functionele technieken te doen die niet mogelijk zijn met deleteverklaringen.

Syntaxis-gebaseerde string-eigenschap Outmission

Deze categorie is bedoeld voor het werken op gewoon object of array-exemplaren in Newer Ecmascript-smaken wanneer een niet-mutatieve aanpak gewenst is en u niet hoeft te zijn voor symbooltoetsen:

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 :(

Op bibliotheek gebaseerde eigenschapomissie

Deze categorie zorgt over het algemeen voor een grotere functionele flexibiliteit, inclusief boekhouding voor Symbolen & het weglaten van meer dan één eigenschap in één statement:

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"

Antwoord 21

@johnstock, we kunnen ook het prototype-concept van JavaScript gebruiken om een methode aan objecten toe te voegen om alle doorgegeven sleutels die beschikbaar zijn bij het aanroepen van objecten te verwijderen.

Bovenstaande antwoorden worden op prijs gesteld.

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 }

22

Dan’s bewering Die ‘Verwijderen’ is erg traag en de benchmark die hij heeft gepost, werden getwijfeld. Dus ik heb de test zelf in Chrome 59 uitgevoerd. Het lijkt erop dat ‘Delete’ ongeveer 30 keer langzamer is:

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

Houd er rekening mee dat ik onderwerp onderzweed meer dan één ‘delete’-operaties in één luscyclus om het effect veroorzaakt door de andere operaties te minimaliseren.


23

U kunt een filter zoals hieronder

gebruiken

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)

24

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)

25

Als u het originele object niet wilt wijzigen.

Verwijder een woning zonder het object

te monteren

Als mutabiliteit een probleem is, kunt u een volledig nieuw object maken door alle eigendommen van het oude te kopiëren, behalve degene die u wilt verwijderen.

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

26

Twee manieren om een ​​object

te verwijderen

  1. Gebruik voor in

    function deleteUser(key) {
         const newUsers = {};
         for (const uid in users) {
             if (uid !== key) {
                 newUsers[uid] = users[uid];
             }
         return newUsers
     }
    

of

delete users[key]

Other episodes