code: function recursiveFn(source, target, key) {
      if (isArray(source) || isObject(source)) {
        target = isPrimitive(target) ? isObject(source) ? {} : [] : target;
        for (var _key in source) {
          // $FlowFixMe: support computed key here
          setter(target, _key, recursiveFn(source[_key], target[_key], _key));
          // target[key] = recursiveFn(source[key], target[key], key);
        }
        return target;
      }
      return fn(source, target, key);
    }
docs: use recursive to move what in source to the target if you do not provide a target, we will create a new target