ES7 中执行字符串对象合并的最快方法是什么?

What is the fastest way in ES7 to perform a merge of an object of object of string?

我有一个包含字符串的对象。

  const userKeyframes = {
    from: {
      opacity: 1,
    },
    '40%': {
      transform: 'skew(20deg)',
      opacity: 1,
    },
    '80%': {
      transform: 'skew(-5deg)',
      opacity: 1,
    },
    to: {
      transform: 'translate3d(-100%, 0, 0) skew(10deg)',
      opacity: 0,
    },
  };

我曾经用 ImmutableJS 这样做:

  const merge = fromJS(make(options)).mergeDeep(userKeyframes);

我已经试过了 (https://www.webpackbin.com/bins/-KiVy6f5eWDb44W4dXtE) 但没有成功:

  const merge = make(options);
  Object.keys(userKeyframes).forEach((key) => {
    Object.assign(merge[key], userKeyframes[key]);
  });

我不认为我不想只为此保留 immutableJS。

在没有任何第三方库的情况下,ES7 中执行其中两个合并的最快方法是什么?

问题是您假设所有键都存在 merge[key],但显然不能保证这一点。所以 Object.assign(merge[key], .......) 的第一个参数可能是 undefined,这不会产生预期的效果(而是一个错误)。

相反,为第一个参数创建一个新对象,并将结果分配给 merge[key]:

Object.keys(userKeyframes).forEach((key) => {
    merge[key] = Object.assign({}, userKeyframes[key]);
});

但是,上面的代码会在赋值发生之前覆盖 merge[key] 中的任何内容。您可以使用两种不同的方法来处理此问题:

您只能在 merge[key] 不存在的情况下执行赋值,因此在这种情况下您只能赋值 userKeyframes[key]:

Object.keys(userKeyframes).forEach((key) => {
    if (!(key in merge)) {
        merge[key] = Object.assign({}, userKeyframes[key]);
    }
});

或者,您可能希望在两个对象都已存在时真正合并这两个对象,这意味着您希望拥有 userKeyframes[key] 中的所有属性,但同时保留 [=] 中已有的任何其他属性13=] 会被第一个解决方案破坏。

在这种情况下,提供 merge[key]userKeyframes[key] 作为 2nd 和 3rd 参数Object.assign,假设 undefined 中除第一个参数之外的所有值都不会造成问题:

Object.keys(userKeyframes).forEach((key) => {
    merge[key] = Object.assign({}, merge[key], userKeyframes[key]);
});

在最后一段代码中,当merge[key]已经有一个值时,它在userKeyframes[key]中没有出现的属性将保留,而中出现的[=50] =],被 userKeyframes[key] 中的那些覆盖,如 documentation on MDN:

中所述

Later sources' properties will ... overwrite earlier ones.