javascript - Array.push(Object) 插入对象数组

标签 javascript arrays mongoose mongoose-schema

我目前正在尝试从我们的 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/

相关文章:

javascript - 如何在 Javascript 中获取数组中的变量总数?

c - 在不使用临时变量的情况下交换 C 中两个不同数组的元素

node.js - Mongoose findOne 返回空数组字段

javascript - 检查 id 是否与模式匹配

javascript - 使用 GMaps 标记位置从 JavaScript 更新 PHP &lt;input&gt; 字段

javascript - Reactjs,使用map从数组生成JSX元素

javascript - Express 在 req.user.save() 之后不保存

node.js - 一次查询多个集合(mongodb)

javascript - 防止表单提交有效...太好了

php - 来自 PHP 的 jQuery 的 AJAX 响应有困难