如何删除扩展运算符的属性?

我想从响应中删除 drugName,但它没有发生任何想法如何从传播操作符中删除属性? 主要的

  const transformedResponse = transformResponse(response);
const loggerResponse = {...transformedResponse};
delete loggerResponse[drugName];
console.log("LOGGER>>>>", loggerResponse);
logger().info('Drug Price Response=', { ...loggerResponse, memberId: memberId, pharmacyId: pharmacyId });

\ 资料

LOGGER>>>> {
'0': {
isBrand: false,
drugName: 'test drug',
drugStrength: '5 mg 1 5 mg',
drugForm: 'Tablet',
}
}

转换响应

[{
drugName: 'HYDROCODONE-HOMATROPINE MBR',
drugStrength: '5MG-1.5MG',
drugForm: 'TABLET',
brand: false
}]
83203 次浏览

您可以使用 对象解构中的 Rest 语法将除 drugName以外的所有属性转换为 rest变量,如下所示:

const transformedResponse = [{
drugName: 'HYDROCODONE-HOMATROPINE MBR',
drugStrength: '5MG-1.5MG',
drugForm: 'TABLET',
brand: false
},
{
drugName: 'HYDROCODONE ABC',
drugStrength: '10MG',
drugForm: 'SYRUP',
brand: true
}]


const output = transformedResponse.map(({ drugName, ...rest }) => rest)


console.log(output)

另外,当您在 {}中展开一个数组时,您将得到一个对象,其中数组的索引作为键,数组的值作为值。这就是为什么你在 loggerResponse中得到一个以 0为键的对象:

const array = [{ id: 1 }, { id: 2 }]
console.log({ ...array })

如果在 transformedResponse数组的每个对象中都有属性 drugName,那么可以使用 Array.map ()生成一个没有 drugName属性的新数组:

例如:

const transformedResponse = [
{
drugName: 'HYDROCODONE-HOMATROPINE MBR',
drugStrength: '5MG-1.5MG',
drugForm: 'TABLET',
brand: false
},
{
drugName: 'TEST',
drugStrength: '7MG-1.9MG',
drugForm: 'TABLET',
brand: false
}
];


const loggerResponse = transformedResponse.map(o =>
{
let clone = Object.assign({}, o);
return (delete clone.drugName, clone);
});


console.log(loggerResponse);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

另一种选择是编写一个泛型函数 removeKey-

const removeKey = (k, { [k]:_, ...o }) =>
o


const values =
[ { a: 1, x: 1 }
, { a: 1, y: 1 }
, { a: 1, z: 1 }
]


console .log (values .map (v => removeKey ("a", v)))
// [ { x: 1 }, { y: 1 }, { z: 1 } ]

该功能可以很容易地适应删除多个键,如果必要的-

const removeKey = (k = "", { [k]:_, ...o } = {}) =>
o


const removeKeys = (keys = [], o = {}) =>
keys .reduce ((r, k) => removeKey (k, r), o)


const values =
[ { a: 1, x: 1 }
, { a: 1, y: 1 }
, { a: 1, z: 1 }
]


console .log (values .map (v => removeKeys (['a', 'z'], v)))
// [ { x: 1 }, { y: 1 }, {} ]

1行解决方案使用 ES9对象休息操作符

const loggerResponse = {
"0": {
isBrand: false,
drugName: "test drug",
drugStrength: "5 mg 1 5 mg",
drugForm: "Tablet",
},
};
const { drugName, ...newResponse } = loggerResponse["0"];
console.log(newResponse);

这是我找到的最简洁不变的方法。您只需将对象解构为两部分: 一部分是您试图删除的属性(在本例中为 drugName) ,另一部分是您希望保留的对象的其余部分(在本例中为 drugWithoutName)。

完成此操作后,您可以放弃已删除的属性,放弃原始对象,并使用包含所有剩余字段的新对象(本例中为 drugWithoutName)。

提出这种语法并不明显,但一旦你看到它就会明白:

const response = [{
drugName: 'HYDROCODONE-HOMATROPINE MBR',
drugStrength: '5MG-1.5MG',
drugForm: 'TABLET',
brand: false
}]


console.log("response", response)


const removeNamesFromResponse = (response) => {
return response.map(drug => {
const { drugName, ...drugWithoutName } = drug
return drugWithoutName
})
}


const responseWithoutNames = removeNamesFromResponse(response)


console.log("responseWithoutNames", responseWithoutNames)

这些条款进一步解释了这一概念:

Https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90

Https://github.com/airbnb/javascript/blob/master/readme.md#objects——rest-spread

const myObject = {
a: 1,
b: 2,
c: 3
};
const {
b,
...noB // assigns remaining keys to a new `noB` object
} = myObject;
console.log(noB); // => { a: 1, c: 3 }

您可以使用扩展运算符,并简单地将 undefined分配给您不需要的键:

const transformedResponse = [{
drugName: 'HYDROCODONE-HOMATROPINE MBR',
drugStrength: '5MG-1.5MG',
drugForm: 'TABLET',
brand: false
}];


const output = transformedResponse.map((response) => ({
...response,
drugName: undefined
}))


console.log(output);

另一种解决方案是,

return {...(delete obj.del && obj)}

这方面的问题是衬里,在我们的项目在工作的项目失败 构建,因为我没有使用 drugNamestrong 文本

/Eslint no-used-vars: [“ error”,{“ ignoreRestSibling”: true }]/ //‘ drugName’被忽略,因为它有一个 rest 属性兄弟。

Const output = transformedResponse.map (({ drugName,... rest }) = > rest)

Log (输出) 裁判