如何从点差运算符中删除属性?

时间:2019-05-15 18:51:06

标签: javascript arrays ecmascript-6

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

  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',
    }
}

transformResponse

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

7 个答案:

答案 0 :(得分:8)

使用ES9 Object Rest Operator的1行解决方案

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

答案 1 :(得分:4)

您可以使用Rest syntax in Object DestructuringdrugName以外的所有属性都获取到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)

此外,当您在{}内展开数组时,会得到一个对象,该对象的数组索引为键,而数组的值为值。这就是为什么在0中获得一个以loggerResponse作为键的对象的原因:

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

答案 2 :(得分:3)

const myObject = {
  a: 1,
  b: 2,
  c: 3
};
const {
  a,
  ...noA
} = myObject;
console.log(noA); // => { b: 2, c: 3 }

答案 3 :(得分:1)

另一种选择是编写通用函数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 }, {} ]

答案 4 :(得分:1)

这是我发现的最简洁和一成不变的方式。您只需将对象分解为两部分:一部分是您要删除的属性(在这种情况下为drugName),另一部分是您要保留的对象的其余部分({{ 1}})。

完成此操作后,可以放弃已删除的属性,放弃原始对象,并使用具有所有剩余字段的新对象(在这种情况下为drugWithoutName)。

想出语法不是很明显,但是一旦看到它就很有意义:

drugWithoutName

这些文章进一步解释了这个概念:

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

https://github.com/airbnb/javascript/blob/master/README.md#objects--rest-spread

答案 5 :(得分:0)

如果在drugName数组的每个对象中都有属性transformedResponse,则可以使用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;}

答案 6 :(得分:0)

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

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