Array.push(Object) 插入对象数组
Posted
技术标签:
【中文标题】Array.push(Object) 插入对象数组【英文标题】:Array.push(Object) inserts array of objects 【发布时间】:2018-12-19 12:10:06 【问题描述】:我目前正在尝试从我们的 excel 文件中读取我的同事缺席的日子,并使用 mongoose 和 express-js 将它们存储在 mongodb 中。
读取数据工作正常,但更新数据库中的数据总是会产生奇怪的行为,其中使用 Array.push() 将对象插入数组会导致对象数组包含外部数组中的单个对象。
下面的函数从 excel 文件中获取原始数据并尝试将它们存储在数据库中。请忽略代码混乱,我只是在做原型;-)
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]
必须是一个数组。
for ( let k = 0; k < member.absent.length; ++k )
你为什么要跳过第一个条目? (++k
而不是k++
)
@connexo 我不知道++k
会跳过第一个条目。来自 C++,使用前增量而不是后增量是很自然的事情。
@connexo,for
循环不在增量部分依赖于 post 或 prefix。开始和条件部分是正确的,所以数组应该从零循环到长度 - 1。
@NinaScholz 您可以为此添加参考吗?谢谢你纠正我。为了可读性和避免像我这样的错误结论,我仍然建议使用 k++ 而不是 ++k。
【参考方案1】:
看起来,您有一个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]]
));
【讨论】:
+1
- 只需确保member.absent[k]
在所有 种情况下确实是一个数组,否则会出错
@Adelin 对象也可以工作。 docs[j].days_of_absence.push(...member.absent[k]);
但是,(看看我的编辑)member.absent[k]
不是没有数组。这就是为什么我不明白错误来自哪里。
@muXXmit2X,这很有趣。不知何故,你得到了一个额外的数组。以上是关于Array.push(Object) 插入对象数组的主要内容,如果未能解决你的问题,请参考以下文章