[英]Deleting nested property in javascript object
我有一個這樣的 JS 對象:
var tenants = {
'first': {
'name': 'first',
'expired': 1
},
'second': {
'name': 'second'
}
}
我想刪除租戶“first”的“過期”財產,我應該這樣做嗎?
delete tenants['first']['expired'];
注意:這個問題比以下問題更具體: 如何從 JavaScript 對象中刪除屬性? ,因為我的問題集中在“嵌套”部分。
是的。 那行得通。
delete tenants['first']['expired'];
或delete tenants.first.expired;
.
如果你只是因為你想從JSON.stringify()
排除它而刪除它,你也可以將它設置為undefined
,比如JSON.stringify()
tenants['first']['expired'] = undefined;
如果要刪除的屬性存儲在字符串中,則可以使用此函數
function deletePropertyPath (obj, path) {
if (!obj || !path) {
return;
}
if (typeof path === 'string') {
path = path.split('.');
}
for (var i = 0; i < path.length - 1; i++) {
obj = obj[path[i]];
if (typeof obj === 'undefined') {
return;
}
}
delete obj[path.pop()];
};
示例用法
var tenants = {
'first': {
'name': 'first',
'expired': 1
},
'second': {
'name': 'second'
}
}
var property = 'first.expired';
deletePropertyPath(tenants, property);
如果您的應用程序使用 lodash,那么_.unset
是刪除嵌套屬性的安全方法。 您可以指定嵌套鍵而不必擔心它們的存在。
let games = { 'hitman': [{ 'agent': { 'id': 47 } }] };
_.unset(games, 'hitman[0].agent.id');
_.unset(games, 'hitman[0].muffin.cupcake'); // won't break
進一步閱讀: https : //lodash.com/docs/4.17.15#unset
我想出了這個:
const deleteByPath = (object, path) => {
let currentObject = object
const parts = path.split(".")
const last = parts.pop()
for (const part of parts) {
currentObject = currentObject[part]
if (!currentObject) {
return
}
}
delete currentObject[last]
}
用法:
deleteByPath({ "a" : { "b" : true }},"a.b")
如果您的密鑰路徑以.
,說first.expired
在你的情況下,你可以做deleteKey(tenants, 'first.expired')
:
const deleteKey = (obj, path) => { const _obj = JSON.parse(JSON.stringify(obj)); const keys = path.split('.'); keys.reduce((acc, key, index) => { if (index === keys.length - 1) { delete acc[key]; return true; } return acc[key]; }, _obj); return _obj; } let tenants = { 'first': { 'name': 'first', 'expired': 1 }, 'second': { 'name': 'second' } }; const PATH_TO_DELETE = 'first.expired'; tenants = deleteKey(tenants, PATH_TO_DELETE); console.log('DELETE SUCCESSFUL:', tenants);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.