我试图找到键值对值,但我想将键作为参数传递,但它似乎不起作用。
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"
}...
我想要将变量传递两次,一次要排序,另一次要查找值,但它实际上是在查找键值对"变量"这显然不存在。
我如何将其视为争论?
答案 0 :(得分:3)
这有两个方面:
使用名称为variable
而不是文字名variable
的属性创建字段对象,
根据变量的值(而不是文字名variable
)
首先处理#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"以上,很快就不会成真,所以......