2

假设我有一个对象:

obj =
  foo: 'foo'
  bar: 'bar'
  // ... and lots of other stuff ...
  // ... these values vary, and are not actually hard coded ...

我想创建该对象的副本,其中包含其属性的子集。

obj2 =
  foo: obj.foo
  bar: obj.bar
  // *doesn't* copy any other attributes from `obj`

有没有更惯用的方式来做到这一点?就像是

obj2 = copyOnly obj, ['foo', 'bar']

我的意思是,当然,我可以copyOnly自己写,但我正在寻找惯用的方式来做到这一点,而不是家庭烘焙的方式。对于这种情况,您可以推荐这样的成语吗?

4

3 回答 3

2

为什么不编写一个自定义函数来接收原始对象和您想要的字段?keysArray将是从原始对象复制的所有命名键的数组。

function cloneObjectSelectKeys(obj, keysArray) {
    var newObj = {}
    for (var i = 0; i < keysArray.length; i++) {
        newObj[keysArray[i]] = obj[keysArray[i]];
    }
    return newObj;
}

实际演示:http: //jsfiddle.net/9nAwP/

在 CoffeeScript 中:

cloneObjectSelectKeys = (obj, keysArray) ->
    newObj = {}
    for key in keysArray
      newObj[key] = obj[key]
    newObj
于 2013-10-02T20:35:52.610 回答
2

我不会将其描述为比自己编写更惯用的方法,但是lodash(下一代underscore)有一个pick功能

http://lodash.com/docs#pick Creates a shallow clone of object composed of the specified properties. Property names may be specified as individual arguments or as arrays of property names.

它还有一个omit.

__ = require 'lodash'
__.pick(obj,['foo','bar'])

但是也很容易用很多咖啡成语来写等价物

pick = (obj, keys, obj2={}) ->
  obj2[key] = value for own key, value of obj when key in keys
  obj2

或者,如果您更喜欢在按键上循环

pick = (obj, keys, obj2={}) ->
  obj2[key] = obj[key] for key in keys when obj[key]?
  obj2
于 2013-10-02T23:27:26.607 回答
0

你可以做

var obj = {
'property' : 'value',
'property_1' : 'value_1',
'property_2' : 'value_2'
};
function clone(srcObject, propertiesArray) {
    var objcopy = {};
    for(propperty in propertiesArray) {
        objcopy [propertiesArray[propperty]] = srcObject[propertiesArray[propperty]];
    }
    return objcopy;
}
var myClone = clone(obj, ['property', 'property_2']);
于 2013-10-02T20:50:08.160 回答