如何使用动态变量(Meteor)访问嵌入式对象数组的单个字段?

时间:2018-01-18 14:41:59

标签: javascript arrays mongodb object meteor

我有一个字符串数组,其长度已由用户定义。

pickedStrings = ["A", "B", "G", "L", "Y"];

也可以是:

pickedStrings = ["A", "G"] or pickedStrings  = ["A", "L", "Y"]

或任何其他组合。未来还可能有更多可能的字符串。

使用这些字符串,我可以通过循环遍历该数组并查询我的对象来识别mongo文档中的多个对象。

var pickedArray, fLen, pickedDataArray, i;

pickedArray = pickedStrings;
fLen = pickedStrings.length;
pickedDataArray = [];

for (i = 0; i < fLen; i++) {

var item = pickedArray[i];

var values = valueCollection.findOne({'_id': "myDoc"}, {fields: {[item]:1 , '_id':0}});
console.log(values);

pickedDataArray.push(values);

}

console.log(pickedDataArray);

console.log(pickedDataArray);仅返回我想要的对象(例如,pickedStrings = ["A", "B"];指定的对象:

[
     { A:
          { GP: 37.56,
            ES: 67.51,
            EV: 12.12,
            CR: 45.90,
            Data: [Object] 
           } 
      },
      { B:
          { GP: 7.62,
            ES: 7.51,
            EV: 22.82,
            CR: 75.40,
            Data: [Object] 
           } 
       } 
]

这很好用。但是,现在我只需要获得单个字段,例如来自查询(pickedDataArray)的每个对象的GP并将它们保存在新数组中。所以在这种情况下我需要输出:

neededArray = [37.56, 7.62]

我有两个问题我无法解决。第一个是我不知道如何从这个嵌入式对象数组中过滤或只找到一个字段。 我试过这个,但是这不起作用并产生一个具有未定义值的数组:

var neededArray = pickedDataArray.map(a => a.A.GP);

我的第二个问题是,标识符“A”和“B”或用户定义的任何其他字符串是动态变量吗?那么我是否必须使用var item = pickedArray[i];再次编写循环?

我正在使用Meo框架和MongoDB。

1 个答案:

答案 0 :(得分:0)

我得到了您所需的结果,但是仅当pickedStrings和pickedDataArray的长度相同且顺序相同(应该是这种情况)或需要排序时,它才有效。

let neededArray = [];

const neededField = 'GP';
for (let i = 0; i < pickedStrings.length; i++ {
   neededArray.push(pickedDataArray[i][pickedStrings[i]][neededField])
}
console.log(neededArray)