Скажем, я создаю объект следующим образом:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Как лучше всего удалить свойство regex, чтобы получить новый myObject следующим образом?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы удалить свойство объекта (изменить объект), вы можете сделать это следующим образом:
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 действительно запрашивает объект новый, этот метод не будет работать.
Я обновил сейчас, чтобы включить способ сделать это.
это простое и идеальное решение
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.
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]
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}
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 "отключено", чтобы это произошло и для вложенного объекта ... только для этого нужно написать небольшую логику, чтобы получить путь к ключу свойства, который ожидается методом пропуска.
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>var unset = require('lodash.unset');
unset(a,getPathOfKey(a,"price_index.final_price"));На этой странице представлено много разных вариантов не потому, что большинство из них неверны или потому что ответы дублируются, а потому, что соответствующий метод зависит от ситуации, в которой вы находитесь, и целей задач, которые вы и / или вы команда пытается выполнить. Чтобы однозначно ответить на ваш вопрос, нужно знать:
После того, как на эти четыре запроса будут даны ответы, в 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 }Кому это нужно ...
Чтобы завершить ответ @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;
лучший ответ без изменения исходного объекта!
Это не удаляет свойство, а создает неглубокую копию, а не копирует указанный ключ и значение. Это очень большая разница.
Чтобы клонировать объект без свойства:
Например:
let object = { a: 1, b: 2, c: 3 };
И нам нужно удалить a.
const { a, ...rest } = object;
object = rest;
const propKey = 'a';
const { [propKey]: propValue, ...rest } = object;
object = rest;
const removeProperty = (propKey, { [propKey]: propValue, ...rest }) => rest;
object = removeProperty('a', object);
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
очевидно, что вы можете.
но метод filter () создает массив, заполненный всеми элементами массива, которые проходят проверку, поэтому единственная цель фильтра - уменьшение и создание нового массива
Да, это так, но это полезно только в том случае, если вы используете возвращаемое значение фильтра, передавая его в исходную или другую переменную, а также он работает только в том случае, если ему дано возвращаемое значение в функции, переданной в качестве параметра, но нет, если это сделано здесь, поэтому единственной целью является повторение элементов массива, для чего предназначен forEach
Вместо этого вы можете сделать let filter = Object.fromEntries(Object.entries(myObject).filter(d => d !== 'regex' ))
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 }, {})
Два способа удалить объект
используя для в
function deleteUser(key) {
const newUsers = {};
for (const uid in users) {
if (uid !== key) {
newUsers[uid] = users[uid];
}
return newUsers
}
или же
delete users[key]
stackoverflow.com/questions/66047314/… Проверьте эту ссылку. Он имеет дело с чем-то очень похожим