考虑到一个对象:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
如何删除财产 regex 以完成下一个 myObject?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
考虑到一个对象:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
如何删除财产 regex 以完成下一个 myObject?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
当前回答
我用Lodash的“Unset”来让它发生在一个被遗弃的对象中......这只需要写小逻辑来找到由遗弃方法所期望的财产密钥的路径。
返回财产路径作为序列的方法
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>
然后只使用Lodash unset方法从对象中移除财产。
var unset = require('lodash.unset'); unset(a, getPathOfKey(a,“price_index.final_price”));
其他回答
另一个解决方案,使用 Array#reduce。
(六)
const myObject = { ircEvent: 'PRIVMSG',方法: 'newURI', regex: '^http://.*', }; const myNewObject = Object.keys(myObject).reduce((obj, key) => { key!=='regex'? obj[key] = myObject[key] : null; return obj; }, {}); console.log(myNewObject);
我们可以使用
使用删除 object.property 使用删除 object[‘property’] 使用休息,删除多个属性
让 myObject = { “ircEvent”: “PRIVMSG”, “method”: “newURI”, “regex”: “^http://.*”, “regex1”: “^http://.*”, “regex2”: “^http://.*”, “regex3”: “^http://.*”, “regex4”: “^http://.*” }; 删除 myObject.regex; // 使用删除 object.property // 或删除 myObject(‘regex1’); // 使用删除 object(‘property’) const { regex2, regex3, regex4,...newMyObject } = myObject; console.log(n)
使用对象破坏,一个ECMAScript 6功能,它是如此简单:
const { a, ...rest } = { a: 1, b: 2, c: 3 };
或与问题样本:
const myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
const { regex, ...newObject } = myObject;
console.log(newObject);
你可以在Babel try-out编辑中看到它。
编辑:
要重新分配到相同的变量,请使用:
let myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
({ regex, ...myObject } = myObject);
console.log(myObject);
分布式合成(ES6)
要完成 Koen 的答案,如果您想使用扩散合成来删除动态变量,您可以这样做:
const key = 'a'; const { [key]: foo,...rest } = { a: 1, b: 2, c: 3 }; console.log(foo); // 1 console.log(rest); // { b: 2, c: 3 }
* foo 将是一个新的变量,值为 a(即 1)。
延伸答案
每个人都有自己的优点和缺点(查看此性能比较):
删除操作员
它是可读的和短暂的,但是,它可能不是最好的选择,如果你在大量的对象上运行,因为它的性能不优化。
delete obj[key];
重新分配
它比删除更快两倍,但财产不会被删除,并且可以被异化。
obj[key] = null;
obj[key] = false;
obj[key] = undefined;
扩展运营商
{ [key]: val, ...rest } = obj;
假设你有一个类似于此的对象:
var Hogwarts = {
staff : [
'Argus Filch',
'Filius Flitwick',
'Gilderoy Lockhart',
'Minerva McGonagall',
'Poppy Pomfrey',
...
],
students : [
'Hannah Abbott',
'Katie Bell',
'Susan Bones',
'Terry Boot',
'Lavender Brown',
...
]
};
删除物品财产
delete Hogwarts.staff;
delete Hogwarts['staff'];
删除 array index
现在,如果你想移除一个员工或学生,程序有点不同,因为两种属性都是由自己组成的。
Hogwarts.staff.splice(3, 1);
Hogwarts.staff.splice(Hogwarts.staff.indexOf('Minerva McGonnagall') - 1, 1);
笔记
虽然你技术上可以使用删除一个序列,使用它会导致收到错误的结果,当打电话,例如,Hogwarts.staff.length 后来。
因此,在从对象中删除值时,首先要考虑您是否正在处理对象属性,或者您是否正在处理序列值,并根据此选择适当的策略。
如果你想尝试这个,你可以使用这个Fiddle作为一个起点。