微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 JavaScript 中仅复制选定属性的最短方法是什么?

如何解决在 JavaScript 中仅复制选定属性的最短方法是什么?

给定以下两个对象:

let a = { foo: 'bar' };

let b = {
  one: 1,two: 2,three: 3,four: 4,five: 5,six: 6,seven: 7
};

我们可以假设这些对象中的所有值都是基元。目标是将某些属性从对象 b 复制到对象 a,但不是全部。

示例:

a.one = b.one;
a.two = b.two;
// Do not copy item three
a.four = b.four;
a.five = b.five;
a.six = b.six;
// Do not copy item seven

在这个例子中,我们省略了属性 3 和 7,但我们也可以省略任何其他属性,甚至不仅仅是两个项目。如您所见,如果我们处理许多属性,此解决方案可能会非常麻烦。

问题:在 2021 年使用现代 JavaScript 实现类似目标的最短、最简洁、最简单的解决方案是什么?

注意:对于解决方案,您可以假设给出了一个字符串数组。每个字符串代表一个应该被复制的值的键。因此,在上面的示例中,您可以假设给出了 const keys = ['one','two','four','five','six'];

解决方法

我会在给定键的数组上使用 forEach 来复制我需要的内容:

const a = {
  foo: 'bar'
};

const b = {
  one: 1,two: 2,three: 3,four: 4,five: 5,six: 6,seven: 7
};

const doCopy = ['two','five'];

doCopy.forEach(el => a[el] = b[el]);

console.log(a);

,

最简单(也是最短的)可能仍然是一个循环:

const res = {};
for (const key of keys) res[key] = source[key];

您也可以使用 reduce 编写:

const res = keys.reduce((target,key) => { target[key] = source[key]; return target },{});
const res = keys.reduce((target,key) => Object.assign(target,{[key]: source[key]}),{});

或者,使用 Object.fromEntries

const res = Object.fromEntries(keys.map(key => [key,source[key]]));

(但是这不支持分配给现有对象)。

,

这将是我的解决方案。即使它有效,我也不喜欢必须导入依赖项。想知道现代 JavaScript 是否有更好的内置解决方案。

util.js

export function copySelected(a,b,attrs) {
  for (let i=0; i < attrs.length; i+=1) {
    const attr = attrs[i];
    a[attr] = b[attr];
  }
  return a;
}

用法:

import { copySelected } from './util';

let a = { foo: 'bar' };

let b = {
  one: 1,seven: 7
};

copySelected(a,['one','two','four','five','six']);
,

查看评论:

const keys = ['one','six'];

let a = { foo: 'bar' };

let b = {
  one: 1,seven: 7
};

// Loop over the array
keys.forEach(function(key){
  // If the b object contains the key specified in the array
  if(b[key]){
    a[key] = b[key];  // copy that key to a
  }
});

console.log(a);

,

您可以使用 Object.assign 添加从 keysb 的过滤条目(使用 a 数组过滤键/值对):

const a = {
  foo: 'bar'
};

const b = {
  one: 1,seven: 7
};

const keys = ['one','six'];

const res = Object
  .assign(a,Object.fromEntries(Object.entries(b)
    .filter(([k,v]) => keys.includes(k))
  ))
  
console.log(res)

,

您可以分配所需的属性。

a) 没有用于赋值的数组

let a = { foo: 'bar' },b = { one: 1,seven: 7 },keys = ['one','six'];

keys.forEach(k => Object.assign(a,{ [k]: b[k] }));

console.log(a);

b) 带有用于赋值的数组

let a = { foo: 'bar' },'six'];

Object.assign(a,...keys.map(k => ({ [k]: b[k] })));

console.log(a);

,

与@Timo 的答案相同的想法,但具有映射函数和扩展运算符。

function copySelected(a,...attrs) {
  attrs.map(x => a[x] = b[x]);
  return a;
}

let a = { foo: 'bar' };

let b = {
  one: 1,seven: 7
};

console.log( copySelected(a,'one','six'));

,

以下是 ECMAScript 2021 的示例:

const b = {
  one: 1,seven: 7
};

const copyFromThis = ['one','two']

const temp = Object.fromEntries(Object.entries(b).filter(([key,value])=>copyFromThis.includes(key) ))

console.log(temp)

您可以根据需要自定义它!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?