删除javascript对象中的嵌套属性

时间:2016-11-21 03:20:04

标签: javascript

我有一个像这样的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?更具体,因为我的问题集中在'嵌套'部分。

5 个答案:

答案 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

更多阅读:https://lodash.com/docs/4.17.15#unset

答案 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")