ES6仅在已存在的情况下将属性复制到目标

时间:2016-07-07 16:45:01

标签: 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)会以不需要的值结束。

有简单的方法吗?

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

3 个答案:

答案 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)

编辑了OP稍微复杂的请求

只需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]})
  )
);