如果未定义属性,如何从多个对象中删除属性?

时间:2018-10-30 19:17:26

标签: javascript angular typescript

试图从对象中删除属性,如果它没有值,则抛出错误,这是从多个对象中删除相似属性的正确方法。

main.js

  if (data.details.primary.transactionHistory !== undefined ||
                        data.details.secondary.transactionHistory !== undefined) {
                        delete data.details.primary.transactionHistory;
                        delete data.details.secondary.transactionHistory;
                    }

4 个答案:

答案 0 :(得分:1)

您需要 AND 条件,而不是 OR 。按照您的逻辑,如果任何一种情况为真,delete操作都会被触发。只需将||替换为&&

if (data.details.primary.transactionHistory !== undefined &&
                        data.details.secondary.transactionHistory !== undefined) {
                        delete data.details.primary.transactionHistory;
                        delete data.details.secondary.transactionHistory;
                    }

编辑1:

如果您有嵌套的对象,最好一步一步检查属性。

if (data.details && data.details.primary && data.details.primary.transactionHistory !== undefined) {
  delete data.details.primary.transactionHistory
}

如果primary不是details的属性,则现在发生事件,您的代码将不会失败。

您可以相应地简化。

答案 1 :(得分:0)

我不确定您为什么要检查transactionHistory是否不是undefined

尝试一下:

const details = data.details;

if (details) {

  if(details.primary) {
    details.primary.transactionHistory = null;
    // or
    delete details.primary.transactionHistory;
  }

  if(details.secondary) {
    details.secondary.transactionHistory = null;
    // or
    delete details.secondary.transactionHistory;
  }

}

这将本质上完成您在此要实现的目标。

答案 2 :(得分:0)

如果您通常要删除transactionHistory,并且不想为if-statements中的每个嵌套对象创建data.details,则可以执行以下操作:

// Data for snippet
let data = {
  details: { 
    primary: { transactionHistory: 'blah' }, 
    secondary: { transactionHistory: 'blah', someOtherProp: 'still here' },
    nohistory: {},
    miscproperties: { shouldNotBeDeleted: true }
  }
}

// Deletion of transactionHistory from data
Object.keys(data.details).map((item) => { delete data.details[item].transactionHistory })

console.log(data)

如有必要,您可以在左括号和右括号中添加所需的条件。

答案 3 :(得分:0)

如果您经常这样做,则应该将其概括化:

function clean_up(objects, keys) {
    objects.forEach(o => {
        keys.forEach(k => {
            try {
                let base = k.split('.');
                let del = base.pop();
                let host = base.reduce((o, k) => o[k], o);
                delete host[del];
            } catch (e) {}
        });
    });
    return objects;
}

console.log(
    clean_up([{a: {b: 5}}, {z: 3, b: {} }, {c: 8}], ['a.b', 'c'])
);