试图从对象中删除属性,如果它没有值,则抛出错误,这是从多个对象中删除相似属性的正确方法。
main.js
if (data.details.primary.transactionHistory !== undefined ||
data.details.secondary.transactionHistory !== undefined) {
delete data.details.primary.transactionHistory;
delete data.details.secondary.transactionHistory;
}
答案 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'])
);