有没有一种简洁的方法,可以返回一个新对象,该对象不包含原始对象中包含的某些属性,而不必使用类似于lodash的东西?
有没有一种简洁的方法,可以返回一个新对象,该对象不包含原始对象中包含的某些属性,而不必使用类似于lodash的东西?
const { bar, baz, ...qux } = foo
现在,您的对象 qux
具有除 bar
和 baz
之外的 foo
的所有属性。
qux
中的任何值都将更新 foo
中的值。JavaScript 对象是按引用传递的。 - Miroslav Glamuzinaqux
中的一个值,那么foo
的值将不会更新。然而,如果qux
的属性值是一个对象,并且你改变了该对象中的某些内容,那么foo
中相应属性引用的对象也会被更改。 - Steven Oxleyconst { "bar", 'baz', ...qux } = foo
- Sledgeconst x = "Anything"; const obj = { x: "Foo", y:"Bar"}; const {x, ...no_x} = obj;
- Lovethenakedgunconst { ["bar"]:bar, ["baz"]:bas, ...qux } = foo
如果您有 const objKey = "bar";
,则可以使用以下语法:
const { [
${objKey}]:bar, ["baz"]:bas, ...qux } = foo
- MadaShindeInai在现代环境中,您可以使用此代码片段:
function omit(key, obj) {
const { [key]: omitted, ...rest } = obj;
return rest;
}
如果您知道要保留和省略的属性列表,则以下“白名单”方法应有效:
const exampleFilter = ({ keepMe, keepMeToo }) => ({ keepMe, keepMeToo })
console.log(
exampleFilter({
keepMe: 'keepMe',
keepMeToo: 'keepMeToo',
omitMe: 'omitMe',
omitMeToo: 'omitMeToo'
})
)
{ keepMe,keepMeToo }
就像{ keepMe: keepMe,keepMeToo: keepMeToo }
)。 - gyre在npm上有一个名为 blacklist 的包,其API非常灵活。
此外,还有一种情景技巧,使用了对象的剩余-扩展提案(阶段3)。
const {a, b, ...rest} = {a: 1, b: 2, c: 3, d: 4};
a // 1
b // 2
rest // {c: 3, d: 4}
这在React组件中经常使用,当您想使用一些属性并将其余部分作为props传递给<div {...props} />
或类似组件时。
还有一种未被提及的解决方案:
o = {a: 5, b: 6, c: 7}
Object.fromEntries(Object.entries(o).filter(e => e[0] != 'b'))
// Object { a: 5, c: 7 }
省略多个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 }
使用上面的Set
是因为它导致线性对数复杂度,即使exclude
中的元素数量与o
中的元素数量处于相同的渐近等价类。
使用ES7和递归来省略一个键数组。
function omit(keys, obj) {
if (!keys.length) return obj
const { [keys.pop()]: omitted, ...rest } = obj;
return omit(keys, rest);
}
这基于 @Eddie Cooro 的回答。
function omit(keys, obj) {
return keys.reduce((a, e) => {
const { [e]: omit, ...rest } = a;
return rest;
}, obj);
}
该函数用于删除JavaScript对象中指定的属性,其输入为一个由属性名组成的数组和一个对象。返回结果为包含其他所有属性但不包括指定属性的新对象。 - Magical Gordonexport function omitObjectKeys<T extends object = {}>( keys: string[], obj: T, ): Partial<T> { return (keys as any).reduce((a: Partial<T>, e: keyof T) => { const { [e]: omitted, ...rest } = a; return rest; }, obj); }
- Bogdan Suraivar not = ["a", "b"]; // properties to delete from obj object
var o = Object.assign({}, obj);
for (let n of not) delete o[n];
或者
var props = ["c", "d"];
let o = Object.assign({}, ...props.map(prop => ({[prop]:obj[prop]})));
omit(obj, ["properties", "to", "omit"])
来获取一个新的对象,其中不包含在数组中提供的属性。在其他回答的基础上,如果没有需要重复使用或抽象化的必要,这将使用IIFE内联移除黑名单属性。
(
({
// Properties to remove from `someObject`.
omitMe,
omitMeToo,
// The rest of `someObject`, to keep.
...keep
}) => keep
)(someObject)
const someObject = {
keepMe: 'keepMe',
keepMeToo: 'keepMeToo',
omitMe: 'omitMe',
omitMeToo: 'omitMeToo',
};
console.log(
(
({
omitMe,
omitMeToo,
...keep
}) => keep
)(someObject)
);
var original = {
name: 'Rory',
state: 'Bored',
age: '27'
};
var copied = Object.assign({}, original);
delete copied.age;
console.log(copied);