我有一个像这样的JS对象:
var tenants = {
'first': {
'name': 'first',
'expired': 1
},
'second': {
'name': 'second'
}
}
Run Code Online (Sandbox Code Playgroud)
我想删除"第一个"租户的"过期"属性,我应该这样做吗?
delete tenants['first']['expired'];
Run Code Online (Sandbox Code Playgroud)
注意:这个问题比问题更具体:如何从JavaScript对象中删除属性?,我的问题集中在'嵌套'部分.
是.那会有用.
delete tenants['first']['expired'];或delete tenants.first.expired;.
如果您只是因为想要将其排除而删除它JSON.stringify(),您也可以将其设置为undefined,例如tenants['first']['expired'] = undefined;
小智 9
如果您的应用程序使用 lodash,那么这_.unset是删除嵌套属性的安全方法。您可以指定嵌套键而不必担心它们的存在。
let games = { 'hitman': [{ 'agent': { 'id': 47 } }] };
_.unset(games, 'hitman[0].agent.id');
_.unset(games, 'hitman[0].muffin.cupcake'); // won't break
Run Code Online (Sandbox Code Playgroud)
进一步阅读:https : //lodash.com/docs/4.17.15#unset
如果要删除的属性存储在字符串中,则可以使用此功能
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()];
};
Run Code Online (Sandbox Code Playgroud)
用法示例
var tenants = {
'first': {
'name': 'first',
'expired': 1
},
'second': {
'name': 'second'
}
}
var property = 'first.expired';
deletePropertyPath(tenants, property);
Run Code Online (Sandbox Code Playgroud)
如果您想删除任意深度对象中具有特定名称的属性,我建议您使用经过实战检验的库。您可以使用DeepDash,它是 Lodash 的扩展。
// Recursively remove any "expired" properties
_.eachDeep(e, (child, prop, parent, ctx):boolean => {
if (prop === 'expired') {
delete parent[prop];
return false; // per docs, this means do not recurse into this child
}
return true;
});
Run Code Online (Sandbox Code Playgroud)
如果您想要一个新的副本(而不是改变现有对象),DeepDash 还提供了一个omitDeep可以返回新对象的函数。
| 归档时间: |
|
| 查看次数: |
10711 次 |
| 最近记录: |