1

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

main.js

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

4 回答 4

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,您的代码将不会失败。

您可以相应地简化。

于 2018-10-30T19:22:41.817 回答
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;
  }

}

基本上会做与您在这里尝试实现的相同的事情。

于 2018-10-30T19:32:26.003 回答
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)

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

于 2018-10-30T19:55:54.217 回答
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'])
);

于 2018-10-30T20:11:03.127 回答