ES6 仅当属性已存在时才将属性复制到目标
ES6 copy properties to target only if they already exist
本质上是我想要的
let schema = {
name: null,
lastname: null
}
let values = {
name: "John",
unwanted: "haxor"
}
最终进入:
console.log(sanitized); // {name: "John", lastname: null}
--
使用Object.assign(schema, values)
最终会得到不需要的值。
有没有简单的方法?
编辑:我应该补充一点,这是为了避免使用像lodash或underscore这样的库,所以如果解决方案过于复杂,它们将是更可取的解决方案。
没有内置的方法可以实现这一点。但是,有一种简单(几乎微不足道)的方法可以做到这一点:
const sanitized = {};
for (const p in schema)
sanitized[p] = (p in object ? object : schema)[p];
只需从另一个对象检索相同的键:
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 in values ? values : schema)[key])
部分确保仅在第一个架构中的属性不会设置为undefined
编辑为OP稍微复杂的请求
只需将值和架构的键map
到各个对象,然后将它们分散开来。优先考虑values
,方法是将它们放在以下位置:
Object.assign(
schema,
...Object.keys(schema).map(
(key) => ({[key]: schema[key]})
),
...Object.keys(schema).map(
(key) => ({[key]: values[key]})
)
);
如果不想覆盖schema
,请为Object.assign()
指定其他target
:
let sanitized = Object.assign(
{},
...Object.keys(schema).map(
(key) => ({[key]: schema[key]})
),
...Object.keys(schema).map(
(key) => ({[key]: values[key]})
)
);
按照更接近@Bergi答案的模式,您可以使用Object.assign()
做一些不那么冗长的事情:
let sanitized = Object.assign({}, ...Object.keys(schema).map(
(key) => ({[key]: (key in values ? values : schema)[key]})
)
);
相关文章:
- 使用数据属性将HTML数据复制到另一个元素
- 将属性模型复制到剪贴板
- lodash:深度复制对象,但不是所有属性
- 复制第一个属性's值,然后使用第一个属性的值创建新属性
- 复制元素的最佳方式是:只复制元素的类型和属性
- 是否可以将一个DOM元素转换为另一个?或者从中复制所有属性
- 复制不带属性的函数引用
- 使用jQuery将属性从一个元素复制到另一个元素
- 尝试复制粘贴输入字段的值时:无法读取属性'nodeType'的未定义
- 将第一个(对象的)数组的属性复制到不同长度的另一个(对象)数组的Javascript方法
- 将 req.body 属性复制到猫鼬模型中时出错
- 将对象的孙属性复制到新创建的对象,而无需太多代码
- 如何将所有数据属性复制到元素
- 多次循环引用对象,将其属性复制到Javascript/Angularjs中的其他对象
- 正在将对象属性复制到循环中具有空正文的数组中
- 将属性值从一个属性复制到另一个属性中的内部字符串
- 通过属性复制重复项和重复项
- 将对象属性复制到新对象属性 - 而不是通过引用
- ES6 仅当属性已存在时才将属性复制到目标
- 用对象的属性复制对象的函数