如何在JavaScript中省略对象的特定属性

Awe*_*web 4 javascript ecmascript-6

是否有一种干净的方法来返回一个新对象,该对象省略了原始对象包含的某些属性,而不必使用像lodash这样的东西?

Edd*_*oro 25

在现代环境中,您可以使用以下代码片段:

function omit(key, obj) {
  const { [key]: omitted, ...rest } = obj;
  return rest;
}
Run Code Online (Sandbox Code Playgroud)

  • “现代环境”意味着如果您传送未转译的代码,这将适用于 93% 的浏览器。请访问 https://caniuse.com/mdn-javascript_operators_spread_spread_in_destructuring 查看完整兼容性 (2认同)
  • 谁发布未转译的代码? (2认同)

Geo*_*ale 21

const {omittedPropertyA, omittedPropertyB, ...remainingObject} = originalObject;
Run Code Online (Sandbox Code Playgroud)

解释:

使用 ES7

您可以使用对象解构扩展运算符来省略 javascript 对象的属性:

const animalObject = { 'bear': 1, 'snake': '2', 'cow': 3 };
 
const {bear, ...other} = animalObject

// other is: { 'snake': '2', 'cow:'  3}
Run Code Online (Sandbox Code Playgroud)

来源:https : //remotedevdaily.com/two-ways-to-omit-properties-from-a-javascript-object/


Gra*_*sky 21

尚未提及的解决方案:

省略单个

o = {a: 5, b: 6, c: 7}
Object.fromEntries(Object.entries(o).filter(e => e[0] != 'b'))
// Object { a: 5, c: 7 }
Run Code Online (Sandbox Code Playgroud)

省略多个

o = {a: 1, b: 2, c: 3, d: 4}
exclude = new Set(['a', 'b'])
Object.fromEntries(Object.entries(o).filter(e => !exclude.has(e[0])))
// Object { c: 3, d: 4 }
Run Code Online (Sandbox Code Playgroud)

使用上述方法是因为即使 中 的元素数量与 中的元素数量处于同一渐近等价类中,Set它也会导致线性算术复杂性。excludeo

  • 帮助您省略字段而不在代码中留下未使用的变量的解决方案 (3认同)

小智 12

const x = {obj1: 1, obj2: 3, obj3:26};


const {obj1,obj2, ...rest} = x;
console.log(rest)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.9.1/d3.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


wil*_*ell 9

使用带有递归的 ES7 省略键和键数组。

function omit(keys, obj) {
  if (!keys.length) return obj
  const { [keys.pop()]: omitted, ...rest } = obj;
  return omit(keys, rest);
}
Run Code Online (Sandbox Code Playgroud)

这是建立在@Eddie Cooro 回答之上的。

  • 非递归版本: ` function omit(keys, obj) { return keys.reduce((a, e) =&gt; { const { [e]: omit, ...rest } = a; return rest; }, obj) }` (4认同)
  • 打字稿非递归版本: `export function omitObjectKeys&lt;T extends object = {}&gt;( keywords: string[], obj: T, ): Partial&lt;T&gt; { return (keys as any).reduce((a: Partial&lt;T &gt;, e: keyof T) =&gt; { const { [e]: 省略, ...rest } = a; return rest; }, obj); }` (2认同)

gyr*_*yre 8

如果您知道要保留和省略的属性列表,则以下"白名单"方法应该有效:

const exampleFilter = ({ keepMe, keepMeToo }) => ({ keepMe, keepMeToo })

console.log(
  exampleFilter({
    keepMe: 'keepMe',
    keepMeToo: 'keepMeToo',
    omitMe: 'omitMe',
    omitMeToo: 'omitMeToo'
  })
)
Run Code Online (Sandbox Code Playgroud)


gue*_*314 7

可以使用Object.assign()、删除

var not = ["a", "b"]; // properties to delete from obj object
var o = Object.assign({}, obj);
for (let n of not) delete o[n];
Run Code Online (Sandbox Code Playgroud)

或者

var props = ["c", "d"];
let o = Object.assign({}, ...props.map(prop => ({[prop]:obj[prop]})));
Run Code Online (Sandbox Code Playgroud)


ror*_*s89 7

当然,为什么不类似:

var original = {
  name: 'Rory',
  state: 'Bored',
  age: '27'
};

var copied = Object.assign({}, original);
delete copied.age;

console.log(copied);
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/4nL08zk4/


Bri*_*and 7

blacklistnpm上有一个具有非常灵活的api 的软件包。

这也是使用对象剩余扩展提议的一种情境技巧(阶段3)。

const {a, b, ...rest} = {a: 1, b: 2, c: 3, d: 4};
a // 1
b // 2
rest // {c: 3, d: 4}
Run Code Online (Sandbox Code Playgroud)

这通常用在react组件中,在这些组件中您想使用一些属性,并将其余的作为prop传递给a <div {...props} />或类似属性。


小智 6

const { bar, baz, ...qux } = foo
Run Code Online (Sandbox Code Playgroud)

现在,您的对象qux具有和和foo以外的所有属性。barbaz

  • @MiroslavGlamuzina 这是不正确的。如果更改 `qux` 中的值,则 `foo` 的值将不会更新。但是,如果“qux”属性的值是一个对象,并且您更改了该对象中的某些内容,则“foo”相应属性引用的对象也会发生更改。 (12认同)
  • 请记住,这不会克隆对象。更新任何值 ion `qux` 将更新 `foo` 中的值。Javascript 对象通过引用传递。 (2认同)
  • 要选择“字符串”字段,您可以使用以下语法: `const { ["bar"]:bar, ["baz"]:bas, ...qux } = foo` 如果您有 `const objKey = "bar"; ` 你可以使用这样的语法: `const { [`${objKey}`]:bar, ["baz"]:bas, ...qux } = foo` (2认同)

Mit*_*kos 6

如果您已经使用 lodash,您也可以omit(obj, ["properties", "to", "omit"])获取一个没有数组中提供的属性的新对象。


ken*_*ntr 6

基于其他答案:如果不需要可重用性或抽象,这将删除与IIFE内联的黑名单属性。

(
  ({
    // Properties to remove from `someObject`.
    omitMe,
    omitMeToo,
    // The rest of `someObject`, to keep.
    ...keep
  }) => keep
)(someObject)
Run Code Online (Sandbox Code Playgroud)

例子

const someObject = {
  keepMe: 'keepMe',
  keepMeToo: 'keepMeToo',
  omitMe: 'omitMe',
  omitMeToo: 'omitMeToo',
};

console.log(
  (
    ({
      omitMe,
      omitMeToo,
      ...keep
    }) => keep
  )(someObject)
);
Run Code Online (Sandbox Code Playgroud)