我的数据库返回这种User对象:
{
name: "Name",
surname: "Surname",
scores: [<array of scores here>],
facebook_id: "fb_id_here",
access_token: "4y8y09n3vy09y0",
last_login: "some date",
register_date: "somedate"
sessions_count: 453
}
是否有更快的方法来创建仅包含一些键值对的对象,而不是创建一个包含选定字段的新对象?类似的东西:
var NewObject = UserObject.filterFields([name, surname, sessions_count, scores]);
应该产生:
{
name: "Name",
surname: "Surname",
scores: [<array of scores here>],
sessions_count: 453
}
感谢。
答案 0 :(得分:0)
var UserObject = {
name: "Name",
surname: "Surname",
scores: [1,2,3],
facebook_id: "fb_id_here",
access_token: "4y8y09n3vy09y0",
last_login: "some date",
register_date: "somedate",
sessions_count: 453
};
function filterFields(obj, fields) {
return fields.reduce(function(ret, field) {
ret[field] = obj[field];
return ret;
}, {});
}
var NewObject = filterFields(UserObject, ['name', 'surname', 'sessions_count', 'scores']);
console.log(NewObject);
使用此功能,您还可以执行类似
的操作UserObject.filterFields = filterFields.bind(UserObject, UserObject);
然后
var NewObject2 = UserObject.filterFields(['name', 'surname', 'sessions_count', 'scores']);
console.log(NewObject2);
答案 1 :(得分:0)
有很多方法可以做到这一点。如果你包括ES6,还有更多的方法。您可以通过删除键来修改对象;或者您可以创建只包含所需字段的新对象。这是一个简单的想法:
// Copy values for properties present on o1 from o2.
define copyFrom(o1, o2) {
Object.keys(o1).forEach(function(key) { o1[key] = o2[pkey]; });
}
因为您似乎希望能够将其作为对象上的方法来调用:
Object.defineProperty(Object.prototype, 'filterFields', {
value: function(o) { copyFrom(o, this); }
});
现在你可以将其称为
var NewObject = UserObject.filterFields({name: 0, surname: 0, session_count: 0, scores: 0});
使用像{name: 0, ...
之类的对象来指定所需的键的想法可能看起来有点笨拙。另一方面,将键指定为字符串也不是很美观。