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
vslet
的语义正当性不是为了防止重新分配吗?很好,尽管我已经更新了这个问题,因为这不会处理默认值需要从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];