是否有一种干净的方法来返回一个新对象,该对象省略了原始对象包含的某些属性,而不必使用像lodash这样的东西?
答案 0 :(得分:12)
const {omittedPropertyA, omittedPropertyB, ...remainingObject} = originalObject;
使用ES7
您可以使用对象解构和 spread运算符来省略javascript对象的属性:
const animalObject = { 'bear': 1, 'snake': '2', 'cow': 3 };
const {bear, ...other} = animalObject
// other is: { 'snake': '2', 'cow:' 3}
来源:https://remotedevdaily.com/two-ways-to-omit-properties-from-a-javascript-object/
答案 1 :(得分:6)
如果您知道要保留保留的属性列表以及省略,则以下“白名单”方法应该有效:
const exampleFilter = ({ keepMe, keepMeToo }) => ({ keepMe, keepMeToo })
console.log(
exampleFilter({
keepMe: 'keepMe',
keepMeToo: 'keepMeToo',
omitMe: 'omitMe',
omitMeToo: 'omitMeToo'
})
)
答案 2 :(得分:6)
const x = {obj1: 1, obj2: 3, obj3:26};
const {obj1,obj2, ...rest} = x;
console.log(rest)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.9.1/d3.min.js"></script>
答案 3 :(得分:4)
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}
这通常用于您想要使用一些属性的反应组件,并将其余的作为道具传递给<div {...props} />
或类似的。
答案 4 :(得分:3)
使用带有递归的ES7,省略和排列键。
function omit(keys, obj) {
if (!keys.length) return obj
const { [keys.pop()]: omitted, ...rest } = obj;
return omit(keys, rest);
}
这是基于@Eddie Cooro答案的。
答案 5 :(得分:1)
function omitKeys(obj, keys) {
var target = {};
for (var i in obj) {
if (keys.indexOf(i) >= 0) continue;
if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
target[i] = obj[i];
}
return target;
}
答案 6 :(得分:1)
尚未提及的解决方案:
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
中的元素数量在同一个渐近等价类中。< /p>
答案 7 :(得分:0)
您可以使用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];
可选地
var props = ["c", "d"];
let o = Object.assign({}, ...props.map(prop => ({[prop]:obj[prop]})));
答案 8 :(得分:0)
当然,为什么不能这样:
var original = {
name: 'Rory',
state: 'Bored',
age: '27'
};
var copied = Object.assign({}, original);
delete copied.age;
console.log(copied);
答案 9 :(得分:0)
一个解决方案,我确信还有很多其他解决方案。
const testObj = {
prop1: 'value1',
prop2: 'value2',
prop3: 'value3'
};
const removeProps = (...propsToFilter) => obj => {
return Object.keys(obj)
.filter(key => !propsToFilter.includes(key))
.reduce((newObj, key) => {
newObj[key] = obj[key];
return newObj;
}, {});
};
console.log(removeProps('prop3')(testObj));
console.log(removeProps('prop1', 'prop2')(testObj));
&#13;
编辑:我总是忘记delete
...
const testObj = {
prop1: 'value1',
prop2: 'value2',
prop3: 'value3'
};
const removeProps = (...propsToFilter) => obj => {
const newObj = Object.assign({}, obj);
propsToFilter.forEach(key => delete newObj[key]);
return newObj;
};
console.log(removeProps('prop3')(testObj));
console.log(removeProps('prop1', 'prop2')(testObj));
&#13;
答案 10 :(得分:0)
var obj = {
a: 1,
b: 2,
c: 3,
d: {
c: 3,
e: 5
}
};
Object.extract = function(obj, keys, exclude) {
var clone = Object.assign({}, obj);
if (keys && (keys instanceof Array)) {
for (var k in clone) {
var hasKey = keys.indexOf(k) >= 0;
if ((!hasKey && !exclude) || (hasKey && exclude)) {
delete clone[k];
}
}
}
return clone;
};
console.log('Extract specified keys: \n-----------------------');
var clone1 = Object.extract(obj, ['a', 'd']);
console.log(clone1);
console.log('Exclude specified keys: \n-----------------------');
var clone2 = Object.extract(obj, ['a', 'd'], true);
console.log(clone2);
答案 11 :(得分:0)
如果您已经使用lodash,则也可以执行(pInst == NULL)
来获取没有数组中提供的属性的新Object。
答案 12 :(得分:0)
在现代环境中,您可以使用以下代码段:
function omit(key, obj) {
const { [key]: omitted, ...rest } = obj;
return rest;
}
答案 13 :(得分:0)
我看到了这个问题,我想删除一个特定的密钥,而不是一个完整的方法,所以这是我的建议:
const originalObj = {wantedKey: 111, anotherWantedKey: 222, unwantedKey: 1010};
const cleanedObj = Object.assign({unwantedKey: undefined}, originalObj);