删除javascript对象中的嵌套属性

lgc*_*stc 7 javascript

我有一个像这样的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对象中删除属性?,我的问题集中在'嵌套'部分.

Mel*_*igy 9

是.那会有用.

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

  • 我知道 lodash 有东西,但找不到我要找的东西。感谢您提供标准解决方案而不是自定义函数。 (2认同)

Dón*_*nal 8

如果要删除的属性存储在字符串中,则可以使用此功能

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)


Rob*_*ert 5

如果您想删除任意深度对象中具有特定名称的属性,我建议您使用经过实战检验的库。您可以使用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可以返回新对象的函数。