fox*_*fox 237 javascript ecmascript-harmony ecmascript-6 ecmascript-7
我有一个扁平的JS对象:
{a: 1, b: 2, c: 3, ..., z:26}
Run Code Online (Sandbox Code Playgroud)
我想克隆除一个元素之外的对象:
{a: 1, c: 3, ..., z:26}
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么(如果可能,最好使用es6/7)?
Ily*_*kin 349
如果使用Babel,则可以使用以下语法将属性b从x复制到变量b,然后将其余属性复制到变量y中:
let x = {a: 1, b: 2, c: 3, z:26};
let {b, ...y} = x;
Run Code Online (Sandbox Code Playgroud)
并且将transpiled到:
"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"]);
Run Code Online (Sandbox Code Playgroud)
mad*_*ox2 118
var clone = Object.assign({}, {a: 1, b: 2, c: 3});
delete clone.b;
Run Code Online (Sandbox Code Playgroud)
或者如果您接受未定义的财产:
var clone = Object.assign({}, {a: 1, b: 2, c: 3}, {b: undefined});
Run Code Online (Sandbox Code Playgroud)
Pau*_*gel 57
要添加到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};
Run Code Online (Sandbox Code Playgroud)
资源:
das*_*mug 54
对于那些不能使用ES6的人,你可以使用lodash或underscore.
_.omit(x, 'b')
Run Code Online (Sandbox Code Playgroud)
或者ramda.
R.omit('b', x)
Run Code Online (Sandbox Code Playgroud)
vde*_*nne 33
我使用这种单线程ES6语法,
const obj = {a: 1, b: 2, c: 3, d: 4};
const clone = (({b, c, ...others}) => ({...others}))(obj); // remove b and c
console.log(clone);Run Code Online (Sandbox Code Playgroud)
jus*_*ris 21
你可以为它编写一个简单的辅助函数.Lodash具有相同名称的类似功能:省略
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}
Run Code Online (Sandbox Code Playgroud)
另请注意,它比Object.assign更快,然后删除:http://jsperf.com/omit-key
gol*_*ins 15
这是省略我认为尚未提及的动态键的选项:
const obj = { 1: 1, 2: 2, 3: 3, 4: 4 };
const removeMe = 1;
const { [removeMe]: removedKey, ...newObj } = obj;
Run Code Online (Sandbox Code Playgroud)
removeMe别名为removedKey并被忽略。newObj变成{ 2: 2, 3: 3, 4: 4 }. 请注意,删除的键不存在,该值不只是设置为undefined。
cle*_*ing 10
也许是这样的:
var copy = Object.assign({}, {a: 1, b: 2, c: 3})
delete copy.c;
Run Code Online (Sandbox Code Playgroud)
这够好吗?或者c实际上无法复制?
小智 9
使用对象分解
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}Run Code Online (Sandbox Code Playgroud)
这个怎么样:
let clone = Object.assign({}, value);
delete clone.unwantedKey;
Run Code Online (Sandbox Code Playgroud)
我在这里使用对象解构。我已将密码分成变量,其余变量包含除密码之外的所有对象属性和值。注意:rest在这里不是固定关键字,您可以相应地命名它
const obj = {name:"john", password:"Abcds12@", id:"125455"}
const {password,...rest} = obj;
console.log(rest);Run Code Online (Sandbox Code Playgroud)
小智 6
嘿,当你试图复制一个对象然后删除一个属性时,你似乎遇到了引用问题.在某些地方你必须分配原始变量,以便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"}
Run Code Online (Sandbox Code Playgroud)
小智 6
我最近以这种非常简单的方式做到了:
const obj = {a: 1, b: 2, ..., z:26};
Run Code Online (Sandbox Code Playgroud)
只需使用扩展运算符来分离不需要的属性:
const {b, ...rest} = obj;
Run Code Online (Sandbox Code Playgroud)
...和object.assign只取“其余”部分:
const newObj = Object.assign({}, {...rest});
Run Code Online (Sandbox Code Playgroud)
小智 5
您也可以使用扩展运算符来执行此操作
const source = { a: 1, b: 2, c: 3, z: 26 }
const copy = { ...source, ...{ b: undefined } } // { a: 1, c: 3, z: 26 }
Run Code Online (Sandbox Code Playgroud)
那这个呢?我从来没有发现这种模式,但我只是试图排除一个或多个属性,而不需要创建额外的对象。这似乎可以完成工作,但有一些我看不到的副作用。当然可读性不是很好。
const postData = {
token: 'secret-token',
publicKey: 'public is safe',
somethingElse: true,
};
const a = {
...(({token, ...rest} = postData) => (rest))(),
}
/**
a: {
publicKey: 'public is safe',
somethingElse: true,
}
*/
Run Code Online (Sandbox Code Playgroud)
上面使用结构化的解决方案确实会受到以下事实的影响:您有一个已使用的变量,如果您使用该变量,这可能会导致 ESLint 的投诉。
所以这是我的解决方案:
const src = { a: 1, b: 2 }
const result = Object.keys(src)
.reduce((acc, k) => k === 'b' ? acc : { ...acc, [k]: src[k] }, {})
Run Code Online (Sandbox Code Playgroud)
在大多数平台上(IE 除外,除非使用 Babel),你还可以这样做:
const src = { a: 1, b: 2 }
const result = Object.fromEntries(
Object.entries(src).filter(k => k !== 'b'))
Run Code Online (Sandbox Code Playgroud)