过滤Javascript对象或一次删除多个字段

时间:2015-09-19 08:27:50

标签: javascript object filter

我的数据库返回这种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
}

感谢。

2 个答案:

答案 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, ...之类的对象来指定所需的键的想法可能看起来有点笨拙。另一方面,将键指定为字符串也不是很美观。