将对象限制为某些属性的更好方法

时间:2013-10-02 20:32:37

标签: javascript coffeescript

假设我有一个对象:

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,但我正在寻找这种惯用的方法,而不是家庭式的方式。你可以为这种情况推荐这样的成语吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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']);