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

Javascript 将对象属性作为函数参数传递?,javascript,jquery,object,dry,Javascript,Jquery,Object,Dry,我有这三个函数,它们基本上做相同的事情。它们获取来自promise的数据,并为每个函数创建具有相同属性的对象 我想把这个擦干: var getFiles = function() { return wg.getFiles().then(function(data) { processData(data, { type: "File", title: x.filename, created: x.Cre

我有这三个函数,它们基本上做相同的事情。它们获取来自promise的数据,并为每个函数创建具有相同属性的对象

我想把这个擦干:

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

    })
}
然后我可以这样称呼它:

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

    })
}

这是我的想法,但如果有人有更好的,我愿意

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

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函数,但您也可以不使用它们。

出于好奇,您是否认为您当前的方法有问题?当然,
processData()
方法看起来有点难看,但是为了让其他所有内容都可读,我认为它很好。您可以颠倒processData fn中参数的顺序。从函数(数据,道具)到函数(道具,数据),然后从部分应用程序中获益,如果你愿意的话。@Archer我不会说我认为有什么问题,但如果可能或者足够简单,我喜欢保持代码的干爽。如果试图去掉这些代码会导致额外的20行代码,那么是的,这是不值得的。但如果这足够简单,我想学习如何做。请注意,我投票决定结束,因为这主要是基于意见的,我想说你所拥有的一切都很好。只是好奇,什么是
x
,什么是
活动
?您为什么不
从promise中返回
processData(…)
的结果呢?您当前的代码似乎不起作用。我注意到,通过清理从
wg
对象返回的属性并使它们保持一致,可以简化整个问题。是的,但解决问题的方法保持不变:-)如果不清理,您只需针对每个差异使用一个回调函数即可。我不太了解
\uuu.prop()
makeTitle(x)
以及它们今天的工作原理。我正试图找到它的文档,但我什么也没看到。@batmanoops,我把它和,我的意思混淆了
makeTitle
只是作为参数传递的函数,就像
getFeedback
@Batman
$中的
function(x){return…}
表达式一样。因此,要么使用
。.flant(arguments)
,要么在(getFiles(),getEvents(),getfeedbacks())时将其写入
$。然后(function(files,events,feedbacks){var activities=files.concat(events,feedbacks);})