Как удалить свойство из объекта JavaScript?

Скажем, я создаю объект следующим образом:

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

Как лучше всего удалить свойство regex, чтобы получить новый myObject следующим образом?

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

stackoverflow.com/questions/66047314/… Проверьте эту ссылку. Он имеет дело с чем-то очень похожим

Visakh Vijayan 04.02.2021 17:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6 514
1
2 443 535
31
Перейти к ответу Данный вопрос помечен как решенный

Ответы 31

Ответ принят как подходящий

Чтобы удалить свойство объекта (изменить объект), вы можете сделать это следующим образом:

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.info(myObject);

Для всех, кто хочет узнать больше об этом, пользователь Stack Overflow Кангакс написал невероятно подробное сообщение о заявлении delete в своем блоге, Понимание удаления. Настоятельно рекомендуется.

Если вам нужен объект новый со всеми ключами оригинала, кроме некоторых, вы можете использовать деструктуризация.

Демо

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

const {regex, ...newObj} = myObject;

console.info(newObj);   // has no 'regex' key
console.info(myObject); // remains unchanged

Возможно, стоит отметить, что OP спросил: «Как лучше всего удалить регулярное выражение свойства, чтобы получить новый myObject следующим образом?» удаление свойства не создает «новый myObject», оно изменяет существующий, поэтому, если OP действительно запрашивает объект новый, этот метод не будет работать.

matt lohkamp 14.01.2021 03:16

Я обновил сейчас, чтобы включить способ сделать это.

nickf 04.02.2021 17:07

это простое и идеальное решение

Muhammad Taseen 17.02.2021 16:40

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

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

Это работает в Firefox и Internet Explorer, и я думаю, что это работает во всех остальных.

Оператор 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]

Подробности

delete в JavaScript выполняет функцию, отличную от функции ключевого слова в 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 для значения индекса.

  • forEach, map и reduce просто пропустят отсутствующий индекс.

Таким образом, оператор delete не следует использовать для обычного случая удаления элементов из массива. У массивов есть специальные методы для удаления элементов и перераспределения памяти: Array#splice() и Array#pop.

Объединение массива # (start [, deleteCount [, item1 [, item2 [, ...]]]])

Array#splice изменяет массив и возвращает все удаленные индексы. Элементы deleteCount удаляются из индекса start, а item1, item2... itemN вставляется в массив из индекса start. Если deleteCount опущен, элементы из 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 является неразрушающим и возвращает новый массив, содержащий указанные индексы от start до end. Если end не указан, по умолчанию используется конец массива. Если 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]

Массив # pop

Array#pop удаляет последний элемент из массива и возвращает этот элемент. Эта операция изменяет длину массива.

Термин, который вы использовали в заголовке вопроса Remove a property from a JavaScript object, можно интерпретировать по-разному. Первый - удалить его для всей памяти и список ключей объекта, другой - просто удалить его из вашего объекта. Как уже упоминалось в некоторых других ответах, ключевое слово delete является основной частью. Допустим, у вас есть объект вроде:

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

Если вы это сделаете:

console.info(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 предотвратит удаление созданного объекта.

Это означает, что в этом случае вы не сможете удалить этот объект, потому что вы создали переменную regex с помощью оператора var, и если вы это сделаете:

delete regex; //False

Результатом будет false, что означает, что ваш оператор удаления не был выполнен, как вы ожидали. Но если бы вы не создавали эту переменную раньше, и у вас был только myOtherObject["regex"] в качестве последней существующей ссылки, вы могли бы сделать это, просто удалив ее, например:

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

Другими словами, объект JavaScript уничтожается, как только в вашем коде не остается ссылки, указывающей на этот объект.


Обновлять: Спасибо @AgentME:

Setting a property to null before deleting it doesn't accomplish anything (unless the object has been sealed by Object.seal and the delete fails. That's not usually the case unless you specifically try).

Для получения дополнительной информации о Object.seal: Object.seal ()

Объекты в JavaScript можно рассматривать как карты между ключами и значениями. Оператор delete используется для удаления этих ключей, более известных как свойства объекта, по одному.

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

Оператор delete не освобождает память напрямую, и отличается от простого присвоения значения null или undefined свойству тем, что свойство сам удаляется из объекта. Обратите внимание: если ценить удаленного свойства был ссылочным типом (объектом), а другая часть вашей программы все еще содержит ссылку на этот объект, то этот объект, конечно, не будет собираться мусором, пока все ссылки на него не будут исчезнувший.

delete будет работать только со свойствами, дескриптор которых помечает их как настраиваемые.

Другой альтернативой является использование библиотеки Underscore.js.

Обратите внимание, что _.pick() и _.omit() возвращают копию объекта и не изменяют напрямую исходный объект. Назначение результата исходному объекту должно помочь (не показано).

Ссылка: связь_.pick (объект, * ключи)

Вернуть копию объекта, отфильтрованную, чтобы иметь только значения для ключи из белого списка (или массив допустимых ключей).

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

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

Ссылка: связь_.omit (объект, * ключи)

Вернуть копию объекта, отфильтрованную, чтобы опустить ключи из черного списка (или массив ключей).

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

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

Для массивов _.filter() и _.reject() могут использоваться аналогичным образом.

Здесь есть много хороших ответов, но я просто хочу отметить, что при использовании delete для удаления свойства в JavaScript часто бывает целесообразно сначала проверить, существует ли это свойство, чтобы предотвратить ошибки.

Например

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

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

Из-за динамической природы JavaScript часто бывают случаи, когда вы просто не знаете, существует свойство или нет. Проверка наличия obj до && также гарантирует, что вы не выдадите ошибку из-за вызова функции hasOwnProperty () для неопределенного объекта.

Извините, если это не повлияло на ваш конкретный вариант использования, но я считаю, что это хороший дизайн, который можно адаптировать при управлении объектами и их свойствами.

Этот пост очень старый, и я считаю его очень полезным, поэтому я решил поделиться написанной мной функцией отключения на случай, если кто-то еще увидит этот пост и подумает, почему это не так просто, как в функции отключения PHP.

Причина написания этой новой функции unset - сохранить индекс всех других переменных в этом hash_map. Посмотрите на следующий пример и посмотрите, как индекс «test2» не изменился после удаления значения из 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.info(unset('1', unsetArr, true)); // output Object {0: "test", 1: "test2"}
console.info(unset('1', unsetArr, false)); // output Object {0: "test", 2: "test2"}

ECMAScript 2015 (или ES6) поставляется со встроенным объектом Отражать. Свойство объекта можно удалить, вызвав функцию Reflect.deleteProperty () с целевым объектом и ключом свойства в качестве параметров:

Reflect.deleteProperty(myJSONObject, 'regex');

что эквивалентно:

delete myJSONObject['regex'];

Но если свойство объекта не настраивается, его нельзя удалить ни функцией deleteProperty, ни оператором удаления:

let obj = Object.freeze({ prop: "value" });
let success = Reflect.deleteProperty(obj, "prop");
console.info(success); // false
console.info(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

Я лично использую Underscore.js или Лодаш для управления объектами и массивами:

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

Предположим, у вас есть объект, который выглядит так:

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'];

Точно так же удаление всего массива студентов будет выполнено путем вызова delete Hogwarts.students; или delete Hogwarts['students'];.

Удаление индекса массива

Теперь, если вы хотите удалить одного сотрудника или студента, процедура немного отличается, потому что оба свойства сами являются массивами.

Если вы знаете индекс своего сотрудника, вы можете просто сделать это:

Hogwarts.staff.splice(3, 1);

Если вы не знаете индекс, вам также придется выполнить поиск по индексу:

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

Примечание

Хотя технически вы можете использовать delete для массива, его использование приведет к получению неверных результатов при последующем вызове, например, Hogwarts.staff.length. Другими словами, delete удалит элемент, но не обновит значение свойства length. Использование delete также испортит вашу индексацию.

Итак, при удалении значений из объекта всегда сначала учитывайте, имеете ли вы дело со свойствами объекта или имеете дело со значениями массива, и выбирайте подходящую стратегию на основе этого.

Если вы хотите поэкспериментировать с этим, вы можете использовать эта рабочий пример в качестве отправной точки.

Если вы хотите удалить свойство, глубоко вложенное в объект, вы можете использовать следующую рекурсивную функцию с путем к свойству в качестве второго аргумента:

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.info(a);

//Prints {level1: {level2: {}}}

Попробуйте следующий метод. Присвойте Object значение свойства undefined. Затем stringify объект и parse.

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

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

console.info(myObject);

Старый вопрос, современный ответ. Используя деструктуризацию объекта, функцию ECMAScript 6, это очень просто:

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

Или с образцом вопросов:

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

Вы можете увидеть это в действии в пробном редакторе Babel.


Редактировать:

Чтобы переназначить ту же переменную, используйте let:

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

Используя ramda # диссок, вы получите новый объект без атрибута regex:

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

Вы также можете использовать другие функции для достижения того же эффекта - пропустить, выбрать, ...

Другое решение, использующее 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.info(myObject);

Однако он будет мутировать исходный объект. Если вы хотите создать новый объект без с указанным ключом, просто назначьте функцию уменьшения новой переменной, например:

(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.info(myNewObject);

Использование метода Удалить - лучший способ сделать это, согласно описанию MDN, оператор удаления удаляет свойство из объекта. Так что вы можете просто написать:

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

The delete operator removes a given property from an object. On successful deletion, it will return true, else false will be returned. However, it is important to consider the following scenarios:

  • If the property which you are trying to delete does not exist, delete will not have any effect and will return true

  • If a property with the same name exists on the object's prototype chain, then, after deletion, the object will use the property from the prototype chain (in other words, delete only has an effect on own properties).

  • Any property declared with var cannot be deleted from the global scope or from a function's scope.

  • As such, delete cannot delete any functions in the global scope (whether this is part from a function definition or a function (expression).

  • Functions which are part of an object (apart from the
    global scope) can be deleted with delete.

  • Any property declared with let or const cannot be deleted from the scope within which they were defined. Non-configurable properties cannot be removed. This includes properties of built-in objects like Math, Array, Object and properties that are created as non-configurable with methods like Object.defineProperty().

Следующий фрагмент дает еще один простой пример:

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

Для получения дополнительной информации и просмотра дополнительных примеров перейдите по ссылке ниже:

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

Утверждение Дэна о том, что «удаление» выполняется очень медленно, и опубликованный им тест подверглись сомнению. Я сам провел тест в Chrome 59. Кажется, что «удаление» примерно в 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.info ((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.info (Date.now()-t2);  // 205

Обратите внимание, что я намеренно выполнил более одной операции «удаления» в одном цикле цикла, чтобы минимизировать эффект, вызванный другими операциями.

Использование lodash

import omit from 'lodash/omit';

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

Использование Ramda

R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}

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

Я использовал lodash "отключено", чтобы это произошло и для вложенного объекта ... только для этого нужно написать небольшую логику, чтобы получить путь к ключу свойства, который ожидается методом пропуска.

  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 не настроен удалите свойство из объекта.

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

Удаление собственности в JavaScript

На этой странице представлено много разных вариантов не потому, что большинство из них неверны или потому что ответы дублируются, а потому, что соответствующий метод зависит от ситуации, в которой вы находитесь, и целей задач, которые вы и / или вы команда пытается выполнить. Чтобы однозначно ответить на ваш вопрос, нужно знать:

  1. Версия ECMAScript, на которую вы нацеливаетесь
  2. Диапазон типов объектов, свойства которых вы хотите удалить, и типы имен свойств, которые вы должны иметь возможность опускать (только строки? Символы? Слабые ссылки, сопоставленные с произвольными объектами? Все они уже много лет являются типами указателей свойств в JavaScript. )
  3. Этос программирования / шаблоны, которые используете вы и ваша команда. Вы предпочитаете функциональные подходы, и мутации запрещены в вашей команде, или вы используете методы объектно-ориентированного изменения Дикого Запада?
  4. Вы хотите добиться этого с помощью чистого JavaScript или хотите и можете использовать стороннюю библиотеку?

После того, как на эти четыре запроса будут даны ответы, в JavaScript появятся четыре категории «удаления свойств», из которых можно выбрать для достижения ваших целей. Они есть:

Удаление мутирующего свойства объекта, небезопасно

Эта категория предназначена для работы с объектными литералами или экземплярами объектов, когда вы хотите сохранить / продолжить использовать исходную ссылку и не использовать в своем коде функциональные принципы без сохранения состояния. Пример синтаксиса в этой категории:

'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, кроме самого первого выпуска. Однако он изменчив, что нарушает некоторые принципы программирования и влияет на производительность. Это также может привести к неперехваченным исключениям при использовании на ненастраиваемые свойства в строгом режиме.

Пропуск свойства строки на основе остатка

Эта категория предназначена для работы с экземплярами простых объектов или массивов в новых версиях 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 :(

Отсутствие собственности в библиотеке

Эта категория, как правило, обеспечивает большую функциональную гибкость, включая учет символов и пропуск более одного свойства в одном утверждении:

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"

@johnstock, мы также можем использовать концепцию прототипирования JavaScript для добавления метода к объектам для удаления любого переданного ключа, доступного в вызывающем объекте.

Приветствуются приведенные выше ответы.

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

// 1st and direct way 
delete myObject.regex; // delete myObject["regex"]
console.info(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.info(myObject) // { ircEvent: 'PRIVMSG' }

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

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

// Remove key 'd' from obj which doesn't exist
var isRemoved = obj.removeFromObjectByKey('d')
console.info(isRemoved); // false
console.info(obj); // { b: 56, c: 67 }

Распространение синтаксиса (ES6)

Кому это нужно ...

Чтобы завершить ответ @Koen в этой теме, если вы хотите удалить динамическую переменную с использованием синтаксиса распространения, вы можете сделать это следующим образом:

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

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

* foo будет новой переменной со значением a (равным 1).


РАСШИРЕННЫЙ ОТВЕТ ?
Есть несколько распространенных способов удалить свойство из объекта.
У каждого есть свои плюсы и минусы (проверьте это сравнение производительности):

Удалить оператора
Однако читабельный и короткий, он может быть не лучшим выбором, если вы работаете с большим количеством объектов, поскольку его производительность не оптимизирована.

delete obj[key];


Переназначение
Более чем в 2 раза быстрее, чем delete, однако свойство нет удалено и может повторяться.

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


Оператор распространения
Этот оператор ES6 позволяет нам возвращать совершенно новый объект, исключая какие-либо свойства, без изменения существующего объекта. Обратной стороной является то, что он имеет худшую производительность из вышеперечисленных и не рекомендуется использовать, когда вам нужно удалить много свойств за раз.

{ [key]: val, ...rest } = obj;

лучший ответ без изменения исходного объекта!

R.Cha 10.07.2020 21:05

Это не удаляет свойство, а создает неглубокую копию, а не копирует указанный ключ и значение. Это очень большая разница.

RobG 30.10.2020 08:40

Чтобы клонировать объект без свойства:

Например:

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 removeProperty = (propKey, { [propKey]: propValue, ...rest }) => rest;

    object = removeProperty('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 }

Вы можете использовать фильтр, как показано ниже

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.info(filter1)

// way 2

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

console.info(filter2)

Фильтр вам не нужен, в этом случае вы можете использовать forEach

bluejayke 16.09.2020 08:51

очевидно, что вы можете.

anik islam shojib 16.09.2020 09:01

но метод filter () создает массив, заполненный всеми элементами массива, которые проходят проверку, поэтому единственная цель фильтра - уменьшение и создание нового массива

anik islam shojib 16.09.2020 09:15

Да, это так, но это полезно только в том случае, если вы используете возвращаемое значение фильтра, передавая его в исходную или другую переменную, а также он работает только в том случае, если ему дано возвращаемое значение в функции, переданной в качестве параметра, но нет, если это сделано здесь, поэтому единственной целью является повторение элементов массива, для чего предназначен forEach

bluejayke 16.09.2020 09:20

Вместо этого вы можете сделать let filter = Object.fromEntries(Object.entries(myObject).filter(d => d !== 'regex' ))

bluejayke 16.09.2020 09:21

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.info(obj)

Вы также можете просто обработать объект, как массив a2d, используя Object.entries, и использовать splice для удаления элемента, как в обычном массиве, или просто фильтровать объект, как массив, и назначить восстановленный объект обратно исходному Переменная

Если вы не хотите изменять исходный объект.

Удалить свойство без изменения объекта

Если изменчивость вызывает беспокойство, вы можете создать полностью новый объект, скопировав все свойства из старого, кроме того, которое вы хотите удалить.

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.info(updatedObject);

Вот способ ES6 легко удалить запись:

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

const removeItem = 'regex';

const { [removeItem]: remove, ...rest } = myObject;

console.info(remove); // "^http://.*"
console.info(rest); // Object { ircEvent: "PRIVMSG", method: "newURI" }

Очевидный способ удалить свойство из объекта - использовать ключевое слово delete. это можно сделать так:

delete myObject['regex']

или это:

delete myObject.regex

Если вы связаны с изменчивостью, вы можете создать новый объект, скопировав все свойства из старого, кроме того, которое вы хотите удалить.

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

const propertyToRemove = 'regex'
const newObject = Object.keys(myObject).reduce((object, key) => {
   if (key !== propertyToRemove ) {
      object[key] = car[key]
   }
return object }, {})

Два способа удалить объект

  1. используя для в

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

или же

delete users[key]

Другие вопросы по теме