Javascript ES6仅当属性已经存在时才将其复制到目标

Javascript ES6仅当属性已经存在时才将其复制到目标,javascript,ecmascript-6,Javascript,Ecmascript 6,基本上就是我想要的 let schema = { name: null, lastname: null } let values = { name: "John", unwanted: "haxor" } 以以下方式结束: console.log(sanitized); // {name: "John", lastname: null} -- 使用Object.assign(schema,values)会得到不需要的值

基本上就是我想要的

let schema = {
       name: null,
       lastname: null
    }

let values = {
       name: "John",
       unwanted: "haxor"
    }
以以下方式结束:

console.log(sanitized); // {name: "John", lastname: null}
--

使用
Object.assign(schema,values)
会得到不需要的值

有简单的方法吗

编辑:我应该补充一点,这是为了避免使用像lodash或下划线这样的库,所以如果解决方案过于复杂,它们将是更好的解决方案

根据OP稍微复杂的请求进行编辑 只需将值和模式的键映射到各个对象,并将它们分散。通过将
值放在以下各项之后,对其进行优先级排序:

Object.assign(
  schema,
  ...Object.keys(schema).map(
    (key) => ({[key]: schema[key]})
  ),
  ...Object.keys(schema).map(
    (key) => ({[key]: values[key]})
  )
);
如果不想覆盖
架构
,请为
对象指定不同的
目标
。assign()

按照更接近的模式,您可以使用
Object.assign()


只需从另一个对象检索相同的密钥:

Object.keys(schema).forEach(key => schema[key] = (key in values ? values : schema)[key]);
如果要创建新对象,请执行以下操作:

var newObj = {};
Object.keys(schema).forEach(key => newObj[key] = (key in values ? values : schema)[key]);
此外,这也与早期版本的ES兼容(当然,如果您不使用箭头功能)


(输入值?值:模式)[key])
部分确保仅在第一个模式中的属性不会设置为
未定义的

没有实现这一点的内置方法。但是,有一种简单(几乎微不足道)的方法:

const sanitized = {};
for (const p in schema)
    sanitized[p] = (p in object ? object : schema)[p];

只需编写一个简单的更新例程。因为您只需要一个浅层副本,所以可以派生一个Object.assign polyfill,在assign部分中放入一个条件。您需要浅层副本,并且只支持不属于getter和/或setter的可枚举自身属性?浅层副本可以,但不确定值属性是什么意思。(不需要原型属性,如果这是你的意思)已经存在。我不太喜欢把整个
lodash
带到每个项目中。但清理是一项非常频繁的任务,所以模块绝对值得,它是样板循环的更好的替代品。它就像
let sanitized=\u pick(values,Object.keys(schema))
@PatrickRoberts感谢您的注意,它应该是
Object.assign({},schema,\u pick(values,Object.keys(schema))
lodash.pick
导出一个函数,因此它可以是
import\u pick from'lodash.pick'
或任何东西。对于最后一个示例,
const
在语法上是否更正确?因为您没有试图覆盖赋值,而这正是
const
所阻止的。@Seth OP没有指定
sanitized
是否应该是常量。但上一个示例的要点是不要覆盖架构的赋值<代码>让
从本质上促进了这种可能性
const
,出于设计,并没有。@Seth我想你误解了我的意思。第一种方法将OP的
净化的
对象分配给
模式
。第二个示例不涉及
schema
,而是将
sanitized
分配给一个新的单独对象。没有任何语义可以证明
const
优于
let
,反之亦然。好的,我理解你的解释。。。我只是说,分配给一个新的空对象似乎是为了防止新的分配被重新分配。
const
vs
let
的语义正当性不是为了防止重新分配吗?很好,尽管我已经更新了这个问题,因为这不会处理默认值需要从schema对象复制的情况,如果它们不存在于values对象中。@Dan:啊,我明白了,尽管到目前为止,没有一个答案考虑到这一点。添加起来很简单:-)谢谢你的更新。这似乎是最优雅的解决方案。通过它,我可以得出这样的结论:事实上,如果经常这样做的话,图书馆可能是不错的。再次感谢。@Bergi好的,谢谢。我看到你已经更新了你的答案,我用同样的方式更新了我的答案,只是为了让它工作:)
var newObj = {};
Object.keys(schema).forEach(key => newObj[key] = (key in values ? values : schema)[key]);
const sanitized = {};
for (const p in schema)
    sanitized[p] = (p in object ? object : schema)[p];