我目前正在尝试从我们的 excel 文件中读取同事不在的日子,并使用 mongoose 和 express-js 将它们存储在 mongodb 中。
读取数据工作正常,但更新数据库中的数据总是会产生奇怪的行为,其中使用 Array.push() 将对象插入数组会导致对象数组包含外部数组内的单个对象。
下面的函数从 excel 文件中获取原始数据并尝试将它们存储在数据库中。请忽略代码困惑,我只是在制作原型(prototype) ;-)
function getDaysOff( data, callback )
{
Member.find({}, function( err, docs ) {
if ( err )
{
console.error( err );
return [];
}
console.log( "found " + docs.length + " team members" );
docs.forEach( function( element ) {
// reset all arrays befor continuing
element.days_of_absence = [];
} );
data.forEach( function( element ) {
for ( let i = 0; i < element.length; ++i )
{
var member = element[i];
for ( let j = 0; j < docs.length; ++j )
{
if ( member.name.match( new RegExp( docs[j].name, 'g' ) ) )
{
console.log( member.name + " is " + docs[j].name );
for ( let k = 0; k < member.absent.length; ++k )
{
docs[j].days_of_absence.push( member.absent[k] );
console.log( JSON.stringify( member.absent[k] ) );
}
console.log( JSON.stringify( docs[j].days_of_absence ) );
break;
}
}
}
} );
docs.forEach( function( element ) {
element.save();
} );
callback( docs );
});
}
这是成员架构:
var mongoose = require('mongoose')
var MemberSchema = new mongoose.Schema(
{
_id: {
type: 'ObjectId'
},
name: {
type: 'String'
},
prename: {
type: 'String'
},
days_of_absence: {
type: 'Array'
}
}
);
module.exports = mongoose.model('Member', MemberSchema, 'members');
当打印 days_of_absence
时,它会产生如下内容:
[
[ { "date": "2018-01-28T23:00:00.000Z", "reason": "P" } ],
[ { "date": "2018-01-29T23:00:00.000Z", "reason": "P" } ],
...
[ { "date": "2018-09-27T22:00:00.000Z", "reason": "P" } ]
]
其中 members.absent[k]
等于内部数组中的对象。 (我已经检查过了)。
但是我不知道对象周围的数组来自哪里。我错过了什么?我想要的是这样的:
[
{ "date": "2018-01-28T23:00:00.000Z", "reason": "P" },
{ "date": "2018-01-29T23:00:00.000Z", "reason": "P" },
...
{ "date": "2018-09-27T22:00:00.000Z", "reason": "P" }
]
更新
正如我所建议的那样,我已经测试过 member.absent[k]
是否是一个数组,但是在循环中打印它表明它不是。 console.log( member.absent[k] )
产生所需的:
{"date":"2018-09-02T22:00:00.000Z","reason":"P"}
最佳答案
看起来,您有一个用于member.absent[k]
的数组。您可以展开它并获得单个对象。
docs[j].days_of_absence.push(...member.absent[k]);
我不知道这个值是否总是一个数组,你可以做一个并传播它。
docs[j].days_of_absence.push(...(
Array.isArray(member.absent[k])
? member.absent[k]
: [member.absent[k]]
));
关于javascript - Array.push(Object) 插入对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51285686/