我有一个Web应用程序,它使用MongoDB作为数据库,并且我试图遍历单个名为护照的属性中的多个值。
这是我的架构:
var EmployeeDBSchema = new Schema({
/* Passport tab schema */
passportInfo: {
passportDetails: []
},
这是Robomongo的外观:
我尝试检查是否可以将其检索为数组,所以我做了以下工作:
console.log(_.map(results, _.property('passportInfo')));
passportArr = _.map(results, _.property('passportInfo'));
console.log("is passport array? " + _.isArray(passportArr));
结果:
现在,由于它是肯定的,因此我尝试使用ff像普通数组一样对其进行迭代。码:
_.forEach(passportArr, function (value, key) {
_.forEach(passportArr[key], function(value2, key2){
console.log(key2 + " >> " + value2);
});
});
但是,我得到的是:
我如何获得passportExpiry,passportNumberNumber和countryOfOrigin的值?
我真的很难过这个。希望有人能帮上忙。
谢谢。
编辑:不确定这是否有帮助,但是,我从this Plunker获得了结构的想法。 Passport背后的主要思想是用户可以添加无限数量的护照信息(因此
passportInfo
数组)。我正在尝试在此处检索数据,以便可以将其呈现为CSV文件。更新:
这是根据要求(从
results
)展开的console.log
:full results
[ { _id: dummyiddontmind123,
employeeID: '123asd12',
desiredRoleOther: 'Other role',
desiredRole3: 'Role 3',
desiredRole2: 'Role 2',
desiredRole1: 'The Role',
isOpenToIntlAssignment: 'Y',
employeeName: 'Jane Doe',
yrsInIT: 1,
visaInfo:
[ { visaCountryOfOrigin: [Object],
visaNumber: 'asd',
visaEntry: 'Single',
visaExpiry: '2017-03-16T16:00:00.000Z',
visaStatus: 'expired' } ],
passportInfo:
[ { countryOfOrigin: [Object],
passportNumber: [Object],
passportExpiry: '2017-03-03' },
{ countryOfOrigin: [Object],
passportNumber: [Object],
passportExpiry: '2017-03-08T16:00:00.000Z' },
{ countryOfOrigin: [Object],
passportNumber: [Object],
passportExpiry: '2017-03-10T16:00:00.000Z' } ] } ]
[ [ { passportExpiry: '2017-03-03',
passportNumber: { '0': 'EB1234567' },
countryOfOrigin: { '0': 'Philippines' } },
{ passportExpiry: '2017-03-08T16:00:00.000Z',
passportNumber: { '1': 'AS1234' },
countryOfOrigin: { '1': 'Japan' } },
{ passportExpiry: '2017-03-10T16:00:00.000Z',
passportNumber: { '2': 'AX123' },
countryOfOrigin: { '2': 'Singapore' } } ] ]
最佳答案
passportInfo
中的数据有些错误,可能是由于输出后出现一些复制粘贴错误。
我认为您想将所有存储的护照信息导出为格式为csv
的country; number; expiry
。
您要确保的第一件事是实际数据和您期望的数据在结构上是相同的。如果没有,您仍然可以在此之前添加转换步骤(例如,将数组展平或将对象从{0: 123}
转换为[123]
)。
一旦得到控制,就可以从将employee.passportInfo
的对象从结构化对象映射到csv
所需的信息数组开始。使用Array.prototype.map
会发生这种情况。
我在该映射中添加了另一步,以确保将passportInfo.passportNumber
形式的{0: 123}
对象转换为数组[123]
。然后,通过添加csv
和passportInfo.countryOfOrigin
将此数组用于映射到.passportExpiry
的一行。
// The following code snippets only operates on one employee. If you have an array use an iteration function depending on your needs.
const employee = { _id: 123,
employeeID: '123asd12',
desiredRoleOther: 'Other role',
desiredRole3: 'Role 3',
desiredRole2: 'Role 2',
desiredRole1: 'The Role',
isOpenToIntlAssignment: 'Y',
employeeName: 'Jane Doe',
yrsInIT: 1,
visaInfo: [ {
visaCountryOfOrigin: [Object],
visaNumber: 'asd',
visaEntry: 'Single',
visaExpiry: '2017-03-16T16:00:00.000Z',
visaStatus: 'expired' }
],
passportInfo: [ {
countryOfOrigin: 'ABC',
passportNumber: { 0: '123123123' },
passportExpiry: '2017-03-03'
}, {
countryOfOrigin: 'DEF',
passportNumber: { 0: '321321321', 1: '123123123' },
passportExpiry: '2017-03-08T16:00:00.000Z'
}, {
countryOfOrigin: 'GHI',
passportNumber: { 0: '654654654' },
passportExpiry: '2017-03-10T16:00:00.000Z'
} ]
};
const flattenPassportNumbers = numbers =>
Object.keys(numbers).map(key => numbers[key]);
const info = employee.passportInfo.map(({passportNumber, passportExpiry, countryOfOrigin}) =>
flattenPassportNumbers(passportNumber).map(number =>
[countryOfOrigin, number, passportExpiry]
)
);
const flattenLine = ([line]) => line;
const joinLine = (line) => line.join('; ');
const lines = info.map(flattenLine);
console.log(lines.map(joinLine));
console.log(lines.map(joinLine).join('\n'));
如果您不了解某些内容,请随时询问。