基本上我想要的是什么
let schema = {
name: null,
lastname: null
}
let values = {
name: "John",
unwanted: "haxor"
}
最终:
console.log(sanitized); // {name: "John", lastname: null}
-
使用Object.assign(schema, values)
会以不需要的值结束。
有简单的方法吗?
编辑:我应该补充一点,这是为了避免使用像lowdash或underscore这样的库,所以如果解决方案过于复杂,那么它们将是更好的解决方案。
答案 0 :(得分:4)
没有内置的方法可以实现这一点。但是,有一种简单(几乎无足轻重)的方法:
const sanitized = {};
for (const p in schema)
sanitized[p] = (p in object ? object : schema)[p];
答案 1 :(得分:2)
只需从另一个对象中检索相同的密钥:
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
答案 2 :(得分:0)
只需map
个人对象的价值和架构密钥,然后传播它们。在values
之后放置它们的优先级:
Object.assign(
schema,
...Object.keys(schema).map(
(key) => ({[key]: schema[key]})
),
...Object.keys(schema).map(
(key) => ({[key]: values[key]})
)
);
如果您不想覆盖schema
,请为target
指定不同的Object.assign()
:
let sanitized = Object.assign(
{},
...Object.keys(schema).map(
(key) => ({[key]: schema[key]})
),
...Object.keys(schema).map(
(key) => ({[key]: values[key]})
)
);
按照接近@Bergi's answer的模式,您可以使用Object.assign()
做一些不那么冗长的事情:
let sanitized = Object.assign({}, ...Object.keys(schema).map(
(key) => ({[key]: (key in values ? values : schema)[key]})
)
);