Скажем, я создаю объект следующим образом:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Каков наилучший способ удалить свойство, regex
чтобы закончить с новым myObject
следующим образом?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
javascript
javascript-objects
johnstok
источник
источник
delete
это будет самый медленный вариант, поскольку это фактическая операция, а не две другие, которые являются просто назначениями. Но суть дела в том , что назначение свойстваnull
или наundefined
самом деле не удалить свойство из объекта, но вместо этого устанавливает , что собственность на равную определенную величину постоянной. (Ниже приведены причины, по которым это существенно отличается.)Ответы:
Нравится:
демонстрация
Для тех, кто хочет больше узнать об этом, пользователь Stack Overflow kangax написал невероятно подробное сообщение в блоге об
delete
утверждении в своем блоге « Понимание удаления» . Настоятельно рекомендуется.источник
var x = {a : 'A', b : 'B'};
Сравнить:delete x.a; typeof x.a; /* "undefined" */ x.hasOwnProperty('a'); /* false */
сx.b = undefined; typeof x.b; /* "undefined" */; x.hasOwnProperty('b'); /* true */
Объекты в JavaScript могут рассматриваться как карты между ключами и значениями.
delete
Оператор используется , чтобы удалить эти ключи, более широко известные как свойства объекта, по одному за раз.delete
Оператор непосредственно не свободной памяти, и оно отличается от простого присвоения значенияnull
илиundefined
к свойству, в том , что свойство само по себе удаляется из объекта. Обратите внимание, что если значением удаленного свойства был ссылочный тип (объект), а другая часть вашей программы по-прежнему содержит ссылку на этот объект, то этот объект, разумеется, не будет собирать мусор, пока все ссылки на него не будут иметь исчез.delete
будет работать только со свойствами, дескриптор которых помечает их как настраиваемые.источник
Это работает в Firefox и Internet Explorer, и я думаю, что это работает во всех остальных.
источник
delete
Оператор используется для удаления свойств из объектов.Обратите внимание, что для массивов это не то же самое, что удаление элемента . Чтобы удалить элемент из массива, используйте
Array#splice
илиArray#pop
. Например:подробности
delete
в JavaScript функция отличается от функции ключевого слова в C и C ++: он не освобождает память напрямую. Вместо этого его единственной целью является удаление свойств из объектов.Для массивов удаление свойства, соответствующего индексу, создает разреженный массив (т. Е. Массив с «дырой» в нем). Большинство браузеров представляют эти отсутствующие индексы как «пустые».
Обратите внимание, что
delete
не перемещаетсяarray[3]
вarray[2]
.Различные встроенные функции в JavaScript по-разному обрабатывают разреженные массивы.
for...in
пропустит пустой индекс полностью.Традиционный
for
цикл возвращаетundefined
значение в индексе.Любой использующий метод
Symbol.iterator
вернётundefined
значение в индексе.forEach
,map
Иreduce
просто пропустить отсутствующий индекс.Таким образом,
delete
оператор не должен использоваться для общего случая удаления элементов из массива. Массивы имеют специальные методы для удаления элементов и перераспределения памяти:Array#splice()
иArray#pop
.Array # splice (start [, deleteCount [, item1 [, item2 [, ...]]]])
Array#splice
мутирует массив и возвращает все удаленные индексы.deleteCount
элементы удаляются из индексаstart
иitem1, item2... itemN
вставляются в массив из индексаstart
. ЕслиdeleteCount
опущен, то элементы из startIndex удаляются до конца массива.Существует также же названием, но другой, функция на
Array.prototype
:Array#slice
.Array # slice ([начало [, конец]])
Array#slice
является неразрушающим и возвращает новый массив, содержащий указанные индексы, изstart
toend
. Еслиend
не указан, по умолчанию используется конец массива. Еслиend
оно положительное, оно указывает нулевой не включающий индекс, на котором стоит остановиться. Еслиend
оно отрицательное, оно указывает индекс, на котором нужно остановиться, начиная отсчет с конца массива (например, -1 опускает конечный индекс). Еслиend <= start
, результат - пустой массив.Массив # поп
Array#pop
удаляет последний элемент из массива и возвращает этот элемент. Эта операция изменяет длину массива.источник
delete
и создать функцию «Сборка мусора» для ее очистки.splice
в вашем редакторе, ноremove
должно бытьArray.prototype.remove = function(index) { this.splice(index, 1); };
Старый вопрос, современный ответ. Используя деструктуризацию объектов, функцию ECMAScript 6 , это так просто, как:
Или с образцом вопросов:
Вы можете увидеть это в действии в редакторе испытаний Babel.
Редактировать:
Чтобы переназначить одну и ту же переменную, используйте
let
:источник
regex
вы могли бы также назначить его на какой - либо другой переменной, например_
, то , что используется в таких языках , как Go отбрасывать результат:const { regex: _, ...newObject } = myObject;
.const { [key], ...newObject } = myObject;
но это не так, поэтому я не думаю, что это возможно с разрушением.freeze()
'd иseal()
' d вы не можете простоdelete
создать свойство. Так что это отличная альтернатива. Хотя в большинстве случаев, вероятно, в любом случае не имеет смысла удалять свойство из замороженного / запечатанного объекта, учитывая, что весь смысл в том, чтобы дать определенные гарантии относительно ваших структур данных, которые этот шаблон будет подрывать. Для тех случаев, когда вам необходимо неразрушающим образом дублировать объект, но без некоторых его свойств, это идеальноСинтаксис распространения (ES6)
Для тех, кто нуждается в этом ...
Чтобы завершить ответ @Koen в этой теме, на случай, если вы захотите удалить динамическую переменную с использованием синтаксиса распространения, вы можете сделать это так:
*
foo
будет новой переменной со значениемa
( равным 1).РАСШИРЕННЫЙ ОТВЕТ 😇
Существует несколько распространенных способов удаления свойства из объекта.
У каждого есть свои плюсы и минусы ( посмотрите сравнение производительности ):
Delete Operator
Readable и short, однако, это может быть не лучшим выбором, если вы работаете с большим количеством объектов, так как его производительность не оптимизирована.
Переназначение
Более чем в 2 раза быстрее, чем
delete
, однако свойствонеудаляется и может быть повторено.Spread Operator
Этот
ES6
оператор позволяет нам возвращать совершенно новый объект, исключая любые свойства, не изменяя существующий объект. Недостатком является то, что он имеет худшую производительность из вышеперечисленных и не рекомендуется использовать, когда вам нужно удалить много свойств одновременно.источник
Другой альтернативой является использование библиотеки Underscore.js .
Обратите внимание , что
_.pick()
и_.omit()
как вернуть копию объекта и не непосредственно изменять исходный объект. Присвоение результата исходному объекту должно помочь (не показано).Ссылка: ссылка _.pick (объект, * ключи)
Возвращает копию объекта, отфильтрованного, чтобы иметь только значения для ключей из белого списка (или массива допустимых ключей).
Ссылка: ссылка _.omit (объект, * ключи)
Возвращает копию объекта, отфильтрованного для исключения ключей из черного списка (или массива ключей).
Для массивов
_.filter()
и_.reject()
может быть использован аналогичным образом.источник
_.omit(collection, key.toString())
delete obj[prop]
в ~ 100 раз медленнее, чемobj[prop] = undefined
.Термин, который вы использовали в заголовке вашего вопроса
Remove a property from a JavaScript object
, может интерпретироваться по-разному. Один из них - удалить всю память и список ключей объекта, а другой - просто удалить его из вашего объекта. Как уже упоминалось в некоторых других ответах,delete
ключевое слово является основной частью. Допустим, у вас есть ваш объект, как:Если вы делаете:
результат будет:
Вы можете удалить этот конкретный ключ из ваших ключей объекта, например:
Тогда ключ вашего объекта
Object.keys(myJSONObject)
будет:Но дело в том, что если вы заботитесь о памяти и хотите, чтобы весь объект был удален из памяти, рекомендуется установить его в null перед удалением ключа:
Другим важным моментом здесь является осторожность в отношении других ссылок на тот же объект. Например, если вы создаете переменную вроде:
Или добавьте его как новый указатель на другой объект, например:
Тогда, даже если вы удалите его из своего объекта
myJSONObject
, этот конкретный объект не будет удален из памяти, посколькуregex
переменнаяmyOtherObject["regex"]
все еще имеет свои значения. Тогда как мы можем точно удалить объект из памяти?Ответ будет состоять в том, чтобы удалить все ссылки, которые вы имеете в своем коде, указывающие на этот самый объект, а также не использовать
var
операторы для создания новых ссылок на этот объект . Этот последний пункт, касающийсяvar
операторов, является одной из наиболее важных проблем, с которыми мы обычно сталкиваемся, поскольку использованиеvar
операторов будет препятствовать удалению созданного объекта.Это означает, что в этом случае вы не сможете удалить этот объект, потому что вы создали
regex
переменную с помощьюvar
оператора, и если вы это сделаете:Результат будет
false
, что означает, что ваш оператор удаления не был выполнен, как вы ожидали. Но если вы ранее не создавали эту переменную и использовали толькоmyOtherObject["regex"]
свою последнюю существующую ссылку, вы могли бы сделать это, просто удалив ее следующим образом:Другими словами, объект JavaScript уничтожается, как только в вашем коде не остается ссылки на этот объект.
Обновление: благодаря @AgentME:
Чтобы получить больше информации о
Object.seal
: Object.seal ()источник
myJSONObject.regex
значение является строкой и вы назначаете его какому-либо другому объекту, у другого объекта есть копия этого значения.ECMAScript 2015 (или ES6) поставляется со встроенным объектом Reflect . Удалить свойство объекта можно, вызвав функцию Reflect.deleteProperty () с целевым объектом и ключом свойства в качестве параметров:
что эквивалентно:
Но если свойство объекта не настраивается, его нельзя удалить ни с помощью функции deleteProperty, ни с помощью оператора delete:
Object.freeze () делает все свойства объекта неконфигурируемыми (кроме прочего).
deleteProperty
Функция (а также оператор удаления ) возвращает,false
когда пытается удалить любое из своих свойств. Если свойство является настраиваемым, оно возвращаетсяtrue
, даже если свойство не существует.Разница между
delete
иdeleteProperty
заключается в использовании строгого режима:источник
apply
,call
,bind
функции ...Предположим, у вас есть объект, который выглядит так:
Удаление свойства объекта
Если вы хотите использовать весь
staff
массив, правильным способом будет сделать это:В качестве альтернативы, вы также можете сделать это:
Точно так же удаление всего массива студентов будет выполнено путем вызова
delete Hogwarts.students;
илиdelete Hogwarts['students'];
.Удаление индекса массива
Теперь, если вы хотите удалить одного сотрудника или студента, процедура немного отличается, поскольку оба свойства являются самими массивами.
Если вы знаете индекс своего сотрудника, вы можете просто сделать это:
Если вы не знаете индекс, вам также придется выполнить поиск по индексу:
Запись
Хотя технически вы можете использовать
delete
массив, его использование приведет к неправильным результатам при вызове, например,Hogwarts.staff.length
позже. Другими словами,delete
удалит элемент, но не обновит значениеlength
свойства. Использованиеdelete
также может испортить вашу индексацию.Таким образом, при удалении значений из объекта всегда сначала учитывайте, имеете ли вы дело со свойствами объекта или со значениями массива, и выбирайте соответствующую стратегию на основе этого.
Если вы хотите поэкспериментировать с этим, вы можете использовать эту скрипку в качестве отправной точки.
источник
splice
массив вместоdelete
.delete
даже не должно быть вещью. Этоsplice
то, что искал ОП.delete
должен использоваться для свойств объекта иsplice
для элементов массива.delete
массивов, было бы разумно вообще не создавать код, сконцентрированный вокруг него.Используя ES6:
(Разрушение + Оператор распространения)
источник
Я лично использую Underscore.js или Lodash для манипулирования объектами и массивами:
источник
Оператор удаления - лучший способ сделать это.
Живой пример, чтобы показать:
источник
delete
оператора полезно для сбора мусора , оно может быть неожиданно медленным , в немалой степени по той же причине.Чтобы клонировать объект без свойства:
Например:
И нам нужно удалить «а».
1. С явным ключом реквизита:
2. С переменным ключом опоры:
Функция стрелки 3.Cool 😎:
4. Для нескольких свойств
Применение
Или
источник
Использование метода удаления - лучший способ сделать это, согласно описанию MDN, оператор удаления удаляет свойство из объекта. Так что вы можете просто написать:
Следующий фрагмент дает еще один простой пример:
Для получения дополнительной информации и увидеть больше примеров, перейдите по ссылке ниже:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
источник
Другое решение, использующее
Array#reduce
.Тем не менее, он будет мутировать оригинальный объект. Если вы хотите создать новый объект без указанного ключа, просто назначьте функцию Reduce новой переменной, например:
(ES6)
источник
Этот пост очень старый, и я нахожу его очень полезным, поэтому я решил поделиться функцией unset, которую я написал, на случай, если кто-то еще увидит этот пост и подумает, почему это не так просто, как в функции unset PHP.
Причиной написания этой новой
unset
функции является сохранение индекса всех других переменных в этом hash_map. Посмотрите на следующий пример и посмотрите, как индекс «test2» не изменился после удаления значения из hash_map.источник
Здесь есть много хороших ответов, но я просто хочу сказать, что при использовании delete для удаления свойства в JavaScript часто целесообразно сначала проверить, существует ли это свойство, чтобы избежать ошибок.
Например
Из-за динамической природы JavaScript часто бывают случаи, когда вы просто не знаете, существует свойство или нет. Проверка существования obj перед тем, как && также гарантирует, что вы не выдадите ошибку из-за вызова функции hasOwnProperty () для неопределенного объекта.
Извините, если это не добавилось к вашему конкретному варианту использования, но я считаю, что это хороший дизайн для адаптации при управлении объектами и их свойствами.
источник
delete foo.bar;
Исключение выдается только в том случае, если foo ложно или если вы находитесь в строгом режиме, а foo является объектом с неконфигурируемым свойством bar.Используя ramda # disoc, вы получите новый объект без атрибута
regex
:Вы также можете использовать другие функции для достижения того же эффекта - опустить, выбрать, ...
источник
Попробуйте следующий метод. Присвойте
Object
значение свойстваundefined
. Тогдаstringify
объект иparse
.источник
JSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
Если вы хотите удалить свойство, глубоко вложенное в объект, то вы можете использовать следующую рекурсивную функцию с путем к свойству в качестве второго аргумента:
Пример:
источник
Вы можете просто удалить любое свойство объекта, используя
delete
ключевое слово.Например:
Например, чтобы удалить любое свойство,
key1
используйтеdelete
ключевое слово, например:Или вы также можете использовать массивную запись:
Ссылка: MDN .
источник
Object.assign () & Object.keys () & Array.map ()
источник
Утверждение Дэна о том, что «удаление» очень медленное, и опубликованный им тест были поставлены под сомнение. Итак, я провел тест самостоятельно в Chrome 59. Кажется, что «delete» примерно в 30 раз медленнее:
Обратите внимание, что я специально выполнил более одной операции удаления в одном цикле цикла, чтобы минимизировать эффект, вызванный другими операциями.
источник
Подумайте о создании нового объекта без
"regex"
свойства, потому что на исходный объект всегда могут ссылаться другие части вашей программы. Таким образом, вы должны избегать манипулирования им.источник
SyntaxError: Unexpected token '...'. Expected a property name.
?Удаление недвижимости в JavaScript
На этой странице представлено много разных опций не потому, что большинство опций неверны - или потому что ответы являются дубликатами, а потому, что подходящий метод зависит от ситуации, в которой вы находитесь, и целей задач, которые вы и / или вы Команда пытается выполнить. Чтобы ответить на ваш вопрос однозначно, нужно знать:
После того, как на эти четыре запроса дан ответ, по сути, в JavaScript есть четыре категории «удаления свойств», чтобы удовлетворить ваши цели. Они есть:
Мутативное удаление свойства объекта, небезопасное
Эта категория предназначена для работы с литералами объекта или экземплярами объекта, когда вы хотите сохранить / продолжить использовать исходную ссылку и не используете функциональные принципы без сохранения состояния в вашем коде. Пример синтаксиса в этой категории:
Эта категория является самой старой, наиболее простой и широко поддерживаемой категорией удаления имущества. Он поддерживает
Symbol
& индексы массивов в дополнение к строкам и работает во всех версиях JavaScript, кроме самого первого выпуска. Однако это мутация, которая нарушает некоторые принципы программирования и влияет на производительность. Это также может привести к неперехваченным исключениям при использовании ненастраиваемых свойств в строгом режиме. .Пропуск свойства покоя на основе строки
Эта категория предназначена для работы с обычными объектами или массивами в более новых разновидностях ECMAScript, когда требуется немутативный подход и вам не нужно учитывать ключи Symbol:
Мутативное удаление свойства объекта, безопасно
Эта категория предназначена для работы с литералами объекта или экземплярами объекта, когда вы хотите сохранить / продолжить использовать исходную ссылку, защищая от исключений, возникающих в неконфигурируемых свойствах:
Кроме того, хотя изменяющиеся объекты на месте не являются объектами без сохранения состояния, вы можете использовать функциональную природу
Reflect.deleteProperty
для частичного применения и других функциональных методов, которые невозможны с помощьюdelete
операторов.Отсутствие свойства строки на основе синтаксиса
Эта категория предназначена для работы с обычными объектами или массивами в более новых разновидностях ECMAScript, когда требуется немутативный подход и вам не нужно учитывать ключи Symbol:
Пропущенная собственность на основе библиотеки
Эта категория обычно обеспечивает большую функциональную гибкость, включая учет символов и пропуск более чем одного свойства в одном выражении:
источник
источник
delete myObject.regex;
.Вы можете использовать ES6 деструктурирование с оператором отдыха.
Свойства могут быть удалены с помощью разрушения в сочетании с оператором отдыха . В вашем примере регулярное выражение удалено (игнорируется), а остальные свойства возвращаются как остальные.
Или вы можете динамически исключать свойства, подобные этим,
источник
Мы можем удалить любое свойство из объекта javascript, используя следующее:
пример:
источник
Попробуй это
источник