基于原始对象创建新对象的最简单方法,但没有几个字段

Simplest way to create a new object based on the original, but without a few fields

我需要基于原始对象创建一个新对象,其中包含所有字段,但不包含某些字段。在我当前的实现中,我枚举了所有字段,并排除了不需要的字段:

var obj1 = {
  a: 1,
  b: 2,
  c: 3
};

var keys = _.keys(obj);
_.remove(keys, 'c');

var obj2 = _.pick(obj1, keys);
console.log(obj2); // => { a: 1, b: 2 }

但我不喜欢那样,有人可以建议更简单的方法吗?例如在猫鼬中,find 方法接受一串字段,用逗号分隔,要排除任何字段,我只需要添加 minus 符号:name email -password.

您可以尝试这样的操作:

var obj2 = {},
    forbiddenProperties = ['c', 'd'];

Object.keys(obj1).forEach(function (key) {
   if (forbiddenProperties.indexOf(key) >= 0) {
      obj2[key] = obj1[key];
   }
});

您可以创建一个函数来执行此操作,而无需依赖下划线。

function partialClone(obj, excluded) {
  var clone = {};

  for (var key in obj) {
    if (!excluded.includes(key)) {
      clone[key] = obj[key];
    }
  }

  return clone;
}

Working jsFiddle

如果你用的是underscorejs就很简单了,直接用._omit()

var obj1 = {
  a: 1,
  b: 2,
  c: 3
};

var obj2 = _.omit(obj1, ["c"]);

jsfiddle: https://jsfiddle.net/bpursley/hnh5ecam/