当前位置:  开发笔记 > 编程语言 > 正文

克隆除一个键之外的js对象

如何解决《克隆除一个键之外的js对象》经验,为你挑选了9个好方法。

我有一个扁平的JS对象:

{a: 1, b: 2, c: 3, ..., z:26}

我想克隆除一个元素之外的对象:

{a: 1, c: 3, ..., z:26}

最简单的方法是什么(如果可能,最好使用es6/7)?



1> Ilya Palkin..:

如果使用Babel,则可以使用以下语法将属性b从x复制到变量b,然后将其余属性复制到变量y中:

let x = {a: 1, b: 2, c: 3, z:26};
let {b, ...y} = x;

并且将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"]);


如果你在代码中找到未使用的变量,这将导致"未使用的变量'b'." 但警告.
@RossAllen在v3.15.0(2017年2月3日)中添加了一个选项[`ignoreRestSiblings`](http://eslint.org/docs/rules/no-unused-vars#ignorerestsiblings).请参阅:[commit c59a0ba](https://github.com/eslint/eslint/commit/c59a0ba)
@IlyaPalkin有趣.虽然因为它并没有改变范围内存在"b"的事实,但感觉有点懒惰.
如果你的模块构建失败:SyntaxError:意外的令牌,你可能需要添加babel rest spread transform插件.见babeljs.io/docs/plugins/transform-object-rest-spread

2> madox2..:
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});


删除的警告是它不是一个不可变的操作.
简单地删除该属性是一种清晰而简单的方法.

3> Paul Kögel..:

要添加到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};

Babel REPL中的演示

资源:

https://twitter.com/ydkjs/status/699845396084846592


@JohnsonWong如何使用允许用于不打算使用的变量的`_`?
这是一个很好的语法.
很好,但是有办法避免使用未使用的var DeletedKey吗?并不是说这会引起任何问题,而是会使JSHint抱怨,并且由于我们确实没有使用它,所以看起来很奇怪。

4> dashmug..:

对于那些不能使用ES6的人,你可以使用lodashunderscore.

_.omit(x, 'b')

或者ramda.

R.omit('b', x)


在这里使用[省略](https://lodash.com/docs/4.17.4#omit)不合逻辑吗?`_.omit(x,'b')`

5> vdegenne..:

我使用这种单线程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);


6> just-boris..:

你可以为它编写一个简单的辅助函数.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}

另请注意,它比Object.assign更快,然后删除:http://jsperf.com/omit-key



7> clean_coding..:

也许是这样的:

var copy = Object.assign({}, {a: 1, b: 2, c: 3})
delete copy.c;

这够好吗?或者c实际上无法复制?



8> 小智..:

使用对象分解

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}


9> 小智..:

嘿,当你试图复制一个对象然后删除一个属性时,你似乎遇到了引用问题.在某些地方你必须分配原始变量,以便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"}

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有