使用函数参数来查找和对象键值对?

时间:2015-07-04 17:35:40

标签: javascript meteor

我试图找到键值对值,但我想将键作为参数传递,但它似乎不起作用。

function drawPieChart(){  

var findData = function(variable){
    return dailyLog.find({createdBy: Meteor.user().username}, {fields: {variable: 1}}).fetch()[0].variable;
};

var data = [
    {
        value: findData(adherence),
        color: "#CBDDE7"
    }...

我想要将变量传递两次,一次要排序,另一次要查找值,但它实际上是在查找键值对"变量"这显然不存在。

我如何将其视为争论?

1 个答案:

答案 0 :(得分:3)

这有两个方面:

  1. 使用名称为variable而不是文字名variable的属性创建字段对象,

  2. 根据变量的值(而不是文字名variable

  3. 访问结果字段

    首先处理#2因为它更容易:在JavaScript中,您可以使用点表示法和属性名称文字(obj.foo)或使用括号表示法来访问对象上的属性属性名称​​ string *(obj["foo"])。在后一种情况下,字符串可以是任何表达式的结果,包括变量查找。因此,如果variable包含"foo",那么obj[variable]将在foo上获取或设置obj属性。

    回到#1:现在,您必须首先创建要作为fields传递的对象,然后通过括号表示法而不是在对象初始值设定项中分配属性值:

        var fields = {};
        fields[variable] = 1;
    

    如果variable包含"foo",则fields[variable] = 1会将foo上的fields属性设置为1

    所以把它们放在一起:

    var findData = function(variable){
        var fields = {};
        fields[variable] = 1;
        return dailyLog.find({createdBy: Meteor.user().username}, {fields: fields}).fetch()[0][variable];
        // Note ------------------------------------------------------------------------------^--------^
    };
    

    在下一版本的JavaScript,即ECMAScript6(又名ES6)中,您将能够使用"计算属性名称"来做#1;在对象初始值设定项中(仍然使用括号表示法检索它)。也许不出所料,计算属性名称使用......括号!

    // ES6 only!!
    var findData = function(variable){
        return dailyLog.find({createdBy: Meteor.user().username}, {fields: {[variable]: 1}}).fetch()[0].[variable];
        // Note ------------------------------------------------------------^--------^ --- and ---------^--------^
    };
    

    *旁注:在ES6中,括号表示法可用于名为Symbols的字符串以及字符串。它与你的问题无关,但我说" string"以上,很快就不会成真,所以......