Answers:
如果使用Babel,则可以使用以下语法将属性b从x复制到变量b,然后将其余属性复制到变量y:
let x = {a: 1, b: 2, c: 3, z:26};
let {b, ...y} = x;
并将其转换为:
"use strict";
function _objectWithoutProperties(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;
}
var x = { a: 1, b: 2, c: 3, z: 26 };
var b = x.b;
var y = _objectWithoutProperties(x, ["b"]);
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
v3.15.0(2017年2月3日)中添加了一个选项。参见:commit c59a0ba
b
范围内的事实。
var clone = Object.assign({}, {a: 1, b: 2, c: 3});
delete clone.b;
或如果您接受未定义的属性:
var clone = Object.assign({}, {a: 1, b: 2, c: 3}, {b: undefined});
要增加Ilya Palkin的答案:您甚至可以动态删除键:
const x = {a: 1, b: 2, c: 3, z:26};
const objectWithoutKey = (object, key) => {
const {[key]: deletedKey, ...otherKeys} = object;
return otherKeys;
}
console.log(objectWithoutKey(x, 'b')); // {a: 1, c: 3, z:26}
console.log(x); // {a: 1, b: 2, c: 3, z:26};
资源:
_
的变量?
var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
对于无法使用ES6的用户,可以使用lodash
或underscore
。
_.omit(x, 'b')
或者ramda
。
R.omit('b', x)
delete
。
我用这ESNext一个班轮
const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = (({ b, c, ...o }) => o)(obj) // remove b and c
console.log(clone)
如果您需要通用功能:
function omit(obj, props) {
props = props instanceof Array ? props : [props]
return eval(`(({${props.join(',')}, ...o}) => o)(obj)`)
}
// usage
const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = omit(obj, ['b', 'c'])
console.log(clone)
map
您可以执行以下操作:(({b, c, ...others}) => ({...others}))(obj)
您可以为此编写一个简单的辅助函数。Lodash具有类似的功能,但名称相同:omit
function omit(obj, omitKey) {
return Object.keys(obj).reduce((result, key) => {
if(key !== omitKey) {
result[key] = obj[key];
}
return result;
}, {});
}
omit({a: 1, b: 2, c: 3}, 'c') // {a: 1, b: 2}
另外,请注意,它比Object.assign更快,然后删除:http : //jsperf.com/omit-key
也许是这样的:
var copy = Object.assign({}, {a: 1, b: 2, c: 3})
delete copy.c;
这样够好吗?还是c
实际上无法复制?
使用对象分解
const omit = (prop, { [prop]: _, ...rest }) => rest;
const obj = { a: 1, b: 2, c: 3 };
const objWithoutA = omit('a', obj);
console.log(objWithoutA); // {b: 2, c: 3}
_
并不能解决ESLint的问题...
嘿,似乎在尝试复制对象然后删除属性时遇到了引用问题。您必须在某个地方分配原始变量,以便javascript产生新值。
我使用的简单技巧(可能太可怕了)是这个
var obj = {"key1":"value1","key2":"value2","key3":"value3"};
// assign it as a new variable for javascript to cache
var copy = JSON.stringify(obj);
// reconstitute as an object
copy = JSON.parse(copy);
// now you can safely run delete on the copy with completely new values
delete copy.key2
console.log(obj)
// output: {key1: "value1", key2: "value2", key3: "value3"}
console.log(copy)
// output: {key1: "value1", key3: "value3"}
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
。甚至不必删除它,只需要一个伪造的值即可。
这是一个忽略动态键的选项,我相信它尚未被提及:
const obj = { 1: 1, 2: 2, 3: 3, 4: 4 };
const removeMe = 1;
const { [removeMe]: removedKey, ...newObj } = obj;
removeMe
被别名为removedKey
并被忽略。newObj
成为{ 2: 2, 3: 3, 4: 4 }
。请注意,删除的键不存在,该值不仅仅设置为undefined
。
Lodash 省略
let source = //{a: 1, b: 2, c: 3, ..., z:26}
let copySansProperty = _.omit(source, 'b');
// {a: 1, c: 3, ..., z:26}
您还可以使用传播算子来执行此操作
const source = { a: 1, b: 2, c: 3, z: 26 }
const copy = { ...source, ...{ b: undefined } } // { a: 1, c: 3, z: 26 }
copy
const copy = { ...source, b: undefined }
归结为完全相同。
上面使用结构化的解决方案确实遭受了这样一个事实的困扰,即您拥有一个已使用的变量,如果使用该变量,可能会引起ESLint的抱怨。
所以这是我的解决方案:
const src = { a: 1, b: 2 }
const result = Object.keys(src)
.reduce((acc, k) => k === 'b' ? acc : { ...acc, [k]: src[k] }, {})
在大多数平台上(除非使用Babel,否则IE除外),您还可以执行以下操作:
const src = { a: 1, b: 2 }
const result = Object.fromEntries(
Object.entries(src).filter(k => k !== 'b'))
如果您要处理的是巨大的变量,则不希望先复制然后删除它,因为这样效率低下。
一个具有hasOwnProperty检查的简单for循环应该可以工作,并且更适合将来的需求:
for(var key in someObject) {
if(someObject.hasOwnProperty(key) && key != 'undesiredkey') {
copyOfObject[key] = someObject[key];
}
}
那这个呢?我从来没有发现这种模式,但是我只是试图排除一个或多个属性,而无需创建额外的对象。这似乎可以完成工作,但是有一些副作用我看不到。当然不是很可读。
const postData = {
token: 'secret-token',
publicKey: 'public is safe',
somethingElse: true,
};
const a = {
...(({token, ...rest} = postData) => (rest))(),
}
/**
a: {
publicKey: 'public is safe',
somethingElse: true,
}
*/
我以这种方式完成了它,例如我的Redux reducer中的示例:
const clone = { ...state };
delete clone[action.id];
return clone;
换一种说法:
const clone = { ...originalObject } // note: original object is not altered
delete clone[unwantedKey] // or use clone.unwantedKey or any other applicable syntax
return clone // the original object without the unwanted key
const { [removeMe]: removedKey, ...newObj } = obj;
-看到我对这个问题的回答。
我最近以非常简单的方式做到了:
const obj = {a: 1, b: 2, ..., z:26};
只是使用传播运算符来分隔不需要的属性:
const {b, ...rest} = obj;
...和object.assign只占“其余”部分:
const newObj = Object.assign({}, {...rest});
rest
已经是一个新对象-您不需要最后一行。另外,这与公认的解决方案相同。
const x = {obj1: 1, pass: 2, obj2: 3, obj3:26};
const objectWithoutKey = (object, key) => {
const {[key]: deletedKey, ...otherKeys} = object;
return otherKeys;
}
console.log(objectWithoutKey(x, 'pass'));