我有一个像这样的JS对象:
var tenants = {
'first': {
'name': 'first',
'expired': 1
},
'second': {
'name': 'second'
}
}
我想删除“第一个”租户的“过期”属性,我应该这样做吗?
delete tenants['first']['expired'];
注意:这个问题比问题How do I remove a property from a JavaScript object?更具体,因为我的问题集中在'嵌套'部分。
答案 0 :(得分:7)
是。那会有用。
delete tenants['first']['expired'];
或delete tenants.first.expired;
。
如果您只是因为要将其从JSON.stringify()
中排除而删除它,您也可以将其设置为undefined
,例如tenants['first']['expired'] = undefined;
答案 1 :(得分:7)
如果要删除的属性存储在字符串中,则可以使用此功能
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);
答案 2 :(得分:6)
如果您的应用程序使用lodash,则_.unset
是删除嵌套属性的安全方法。您可以指定嵌套键,而不必担心它们的存在。
let games = { 'hitman': [{ 'agent': { 'id': 47 } }] };
_.unset(games, 'hitman[0].agent.id');
_.unset(games, 'hitman[0].muffin.cupcake'); // won't break
答案 3 :(得分:1)
如果键的路径由.
隔开,例如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);
答案 4 :(得分:0)
我想到了这个
const deleteByPath = (object, path) => {
let currentObject = object
let 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")