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 &lt; 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) 插入对象数组的主要内容,如果未能解决你的问题,请参考以下文章

js数组对象操作

为 array.push() 中的对象命名 [重复]

在承诺中使用 Array.push 时,数组保持为空

js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip

数组中常用的方法

类型错误:无法添加属性 1,对象不可扩展↵ 在 Array.push (<anonymous>)