Как удалить свойство из объекта JavaScript? - PullRequest
5553 голосов
/ 16 октября 2008

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

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

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

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

Ответы [ 38 ]

3 голосов
/ 10 апреля 2019

Вы можете использовать ES6 с оператором покоя.

Свойства можно удалить с помощью деструктурирование в сочетании с оператором rest . В вашем примере регулярное выражение удалено (игнорируется), а остальные свойства возвращаются как остальные.

const noRegex = ({ regex, ...rest }) => rest;
const myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

console.log(noRegex(myObjext)) //=> {  "ircEvent": "PRIVMSG","method": "newURI" }

Или вы можете динамически исключать свойства, подобные этому,

const myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};
const removeProperty = prop => ({ [prop]: _, ...rest }) => rest

const removeRegex = removeProperty('regex') //=> {  "ircEvent": "PRIVMSG","method":"newURI" }
const removeMethod = removeProperty('method') //=> {  "ircEvent": "PRIVMSG", "regex":"^http://.*" }
3 голосов
/ 24 мая 2018

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

Над ответами приветствуются.

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

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

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

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

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

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

// Remove key 'd' from obj which doesn't exist
var isRemoved = obj.removeFromObjectByKey('d')
console.log(isRemoved); // false
console.log(obj); // { b: 56, c: 67 }
2 голосов
/ 09 июля 2017

Очень просто:

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

delete myObject.regex;
1 голос
/ 13 марта 2019

Как уже говорили многие, вы можете использовать "delete" (свойство javascript) или "unset" (используя lodash).

Вы также можете использовать свойство lodash «pick», чтобы выбрать только необходимые свойства объекта. Это поможет, когда вам удастся удалить несколько свойств из объекта.

Использование как показано ниже:

var _   = require("lodash");
var obj = {"a":1, "b":2, "c":3};
obj = _.pick(obj,["a","b"]);    
//Now obj contains only 2 props {"a":1, "b":2}
1 голос
/ 29 сентября 2017

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

  1. Метод, который возвращает путь свойства в виде массива

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

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

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

</div>
  1. Затем просто с помощью lodash unset метод удалить свойство из объекта.

var unset = require('lodash.unset');
unset(a,getPathOfKey(a,"price_index.final_price"));
1 голос
/ 30 апреля 2018
function removeProperty(obj, prop) {
    if(prop in obj){

    Reflect.deleteProperty(obj, prop);
    return true;
   } else {
    return false;
  }
}
1 голос
/ 08 марта 2018

Для

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

delete myObject ["regex"]; Также вы знаете индекс ключа, например. Вам нужно удалить 2-й ключ (регулярное выражение) тогда

var key =  Object.keys(myObject)[2]
delete myObject[key];

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

1 голос
/ 13 октября 2017

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

 var multiverse = {
        earth1: "Silver Age",
        earth2: "Golden Age"
    };

delete multiverse.earth2;//will return true if it finds 

// Outputs: { earth1: "Silver Age" }
console.log(multiverse);

Оператор удаления также имеет return value.. Если ему удастся удалить свойство, он вернет true. Если ему не удастся удалить свойство из-за того, что оно недоступно для записи, оно будет return false или в строгом режиме выдает ошибку.

...