-
ibeautiful
这里有一些更轻巧的东西,尽管它不能避免重复字段列表。它使用“参数析构”来避免对v参数。({id, title}) => ({id, title})@Ethan Brown的解决方案更为普遍。下面是一个更地道的版本,它使用Object.assign,以及计算的属性([p](第一部分)function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));}如果我们希望保留属性的属性,如configurable和getter和setter,同时也省略不可枚举的属性,然后:function pick(o, ...props) {
var has = p => o.propertyIsEnumerable(p),
get = p => Object.getOwnPropertyDescriptor(o, p);
return Object.defineProperties({},
Object.assign({}, ...props .filter(prop => has(prop))
.map(prop => ({prop: get(props)})))
);}
-
宝慕林4294392
我不认为有什么办法比你的答案(或者托拉兹布的答案)更简洁,但实际上你想要做的是模仿下划线pick操作。在ES6中重新实现这一点是非常容易的:function pick(o, ...fields) {
return fields.reduce((a, x) => {
if(o.hasOwnProperty(x)) a[x] = o[x];
return a;
}, {});}那么您就有了一个方便的可重用函数:var stuff = { name: 'Thing', color: 'blue', age: 17 };var picked = pick(stuff, 'name', 'age');
-
一只斗牛犬
解决这一问题的诀窍是翻转所采取的方法:而不是从原始对象开始。orig,你可以从他们想要提取的钥匙开始。使用Array#reduce然后,可以将每个所需的密钥存储在空对象上,该对象作为initialValue为了上述功能。就像这样:const orig = { id: 123456789, name: 'test', description: '…', url: 'https://…',};const filtered = ['id', 'name'].reduce((result, key) => { result[key] = orig[key]; return result; }, {});console.log(filtered); // Object {id: 123456789, name: "test"}
-
元芳怎么了
使用逗号运算符的更短一点的解决方案:const pick = (O, ...K) => K.reduce((o, k) => (o[k]=O[k], o), {})