将对象属性作为函数参数传递?

时间:2016-10-20 13:54:31

标签: javascript jquery object dry

我有三个基本上做同样事情的功能。它们从承诺中获取数据,并为每个函数创建具有相同属性的对象。

我想干这个:

var getFiles = function() {
    return wg.getFiles().then(function(data) {
        processData(data, {
            type: "File",
            title: x.filename,
            created: x.Created,
            path: x.path
        })
    })
}

var getEvents = function() {
    return wg.getEvents().then(function(data) {
        processData(data, {
            type: "Event",
            title: x.Title,
            created: x.Created,
            path: x.path
        })
    })
}

var getFeedback = function() {
    return wg.getFeedback().then(function(data) {
        processData(data, {
            type: "Review",
            title: "by " + x.Author,
            created: x.Created,
            path: x.path
        })
    })
}
var processData = function(data, props) {
    var x = _(data)
    .map(function(x) {return props})
    .value()
.map(function(x) {
    activties.push(x)
})
}

我想通过将processData函数更改为类似的内容来干掉它:

var processData = function(data, props) {
    var x = _(data)
    .map(function(x) {
        return {
            type: x[props[0]],
            title: x[props[1]],
            created: x[props[3]],
            path: "/" + x[props[4]]
        }
    })
    .value()
.map(function(x) {
    activties.push(x)
})
}

然后我可以这样称呼它:

var getFiles = function() {
    return wg.getFiles().then(function(data) {
        processData(data, ['filename', 'created', ['FileRef']['lookupValue']])

    })
}

这就是我的想法,但如果有人有更好的东西,我会打开。

1 个答案:

答案 0 :(得分:1)

不要传递属性名称,传递函数:

function getFiles() {
    return wg.getFiles().then(processData("File", _.property("filename")));
}

function getEvents() {
    return wg.getEvents().then(processData("Event", _.property("Title")));
}

function getFeedback() {
    return wg.getFeedback().then(processData("Review", function(x) { return "by " + x.Author; })));
}

function processData(type, makeTitle) {
    return function(data) {
        return data.map(function(x) {
            return {
                type: type,
                title: makeTitle(x),
                created: x.Created,
                path: x.path
            };
        });
    };
}

Promise.all([getFiles(), getEvents(), getFeedback()])
.then(function(arrays) {
    var activities = _.flatten(arrays);
    …
});

为方便起见,我使用了一些下划线/ lodash函数,但你也可以不用它们。