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

Javascript 将对象限制为某些属性的更好方法,javascript,coffeescript,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 `ob

假设我有一个对象:

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
,但我正在寻找一种惯用的方式来做这件事,而不是自作主张的方式。有没有这样一种习惯用法可以推荐用于此场景?

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

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

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

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

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']);
你能行

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']);

我不会将其描述为比编写自己的代码更为惯用,但
lodash
(下一代
下划线
)具有
拾取功能

创建由指定属性组成的对象的浅克隆。属性名可以指定为单个参数或属性名数组。

它还有一个
省略

__ = 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

我不会将其描述为比编写自己的代码更为惯用,但
lodash
(下一代
下划线
)具有
拾取功能

创建由指定属性组成的对象的浅克隆。属性名可以指定为单个参数或属性名数组。

它还有一个
省略

__ = 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

据我所知,并没有一个真正合适的方法来复制一个对象,就像slice()用于数组一样,所以只复制一个具有预设属性的对象(我假设它是一个对象,即使缺少curlybraces),就更不可能这么简单了,而且你必须“滚动你自己的对象”。@adeneo它确实是一个对象;我使用了coffeescript语法,它允许您通过空格敏感度省略一些大括号、分号、逗号和括号。@adeneo:请看。没有注意到coffeescript标记,也从未真正使用过它,但这与我之前的评论并不重要。如果你不介意拉下划线,你可以使用。据我所知,没有一个真正合适的方法来复制对象,就像slice()对数组那样,所以复制对象(我假设它是一个对象,即使缺少curlybraces)仅使用预设属性更不可能如此简单,您必须“滚动自己的属性”。@adeneo它确实是一个对象;我使用了coffeescript语法,它允许您通过空格敏感度省略一些大括号、分号、逗号和括号。@adeneo:请看。没有注意到coffeescript标记,也从未真正使用过它,但对于我之前的评论,这并不重要。如果你不介意加下划线的话,你可以使用。季梅杰夫的回答是非常地道的。注意,克隆对象的惯用方法只是一个循环遍历并将自己的属性复制到新对象的函数,您不应该抵制将函数作为解决方案。这正是JS库的本质。我只是希望一个常用的JS库能被推荐作为解决方案。你的意思是,像构造函数一样!?:)季梅耶夫的回答是非常地道的。注意,克隆对象的惯用方法只是一个循环遍历并将自己的属性复制到新对象的函数,您不应该抵制将函数作为解决方案。这正是JS库的本质。我只是希望一个常用的JS库能被推荐作为解决方案。你的意思是,像构造函数一样!?:)