假设我有一个对象:
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
,但我正在寻找这种惯用的方法,而不是家庭式的方式。你可以为这种情况推荐这样的成语吗?
答案 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']);