Nodejs 请教如何实现把一个普通Json对象的key/value值赋值到另一个object中同名的key中

Nodejs 请教如何实现把一个普通Json对象的key/value值赋值到另一个object中同名的key中

大家好,我想实现这样的功能,如有一个mongoose的Schema定义如下: <code> var UserSchema=new Schema({ id:ObjectId, tags:[String], msgbody:String, sms:Boolean, age:Number, createtime:{type: Date, default: Date.now }, bdlocation:BdLocation, items:[Item] });

var Item={ id:String, name:String };

var BdLocation={ id:String, area:String, city:String };

//data示例值 var data={id:‘100’,tags:[‘tag1’,‘tag2’],msgbody:‘hi’,sms:True,age:30,bdlocation:new BdLocation{id:‘200’,area:‘area2’,city:‘gz’},items:[{},{}]};

function docopy(data){ var user = new UserSchema(); //一般是这样一个个赋值 user.id=data.id; user.tags=data.tags; user.msgbody=data.msgbody; user.sms=data.sms; user.age=data.age; user.bdlocation=data.bdlocation; user.items=data.items; //但如果字段多就比较麻烦,效率也不高,请问有没有一些函数可以完成这样的动作。 user=copyValue(data); //不知是否存在这样的一个copy函数??? //或这种需求请问如何实现比较好??谢谢!

user.save(function(err){ if(err){ console.log(err); } }); } </code>


5 回复

当然可以。根据你的需求,我们可以编写一个简单的函数来将一个JSON对象中的键值对复制到另一个对象中具有相同键的对象里。这可以通过遍历源对象的属性并将其值分配给目标对象来实现。

示例代码

const mongoose = require('mongoose');

// 定义Schema
var UserSchema = new mongoose.Schema({
    id: mongoose.ObjectId,
    tags: [String],
    msgbody: String,
    sms: Boolean,
    age: Number,
    createtime: { type: Date, default: Date.now },
    bdlocation: {
        id: String,
        area: String,
        city: String
    },
    items: [{ 
        id: String,
        name: String
    }]
});

var BdLocation = {
    id: String,
    area: String,
    city: String
};

var Item = {
    id: String,
    name: String
};

// 示例数据
var data = {
    id: '100',
    tags: ['tag1', 'tag2'],
    msgbody: 'hi',
    sms: true,
    age: 30,
    bdlocation: new BdLocation({ id: '200', area: 'area2', city: 'gz' }),
    items: [{ id: '1', name: 'item1' }, { id: '2', name: 'item2' }]
};

// 复制函数
function copyValue(source, targetSchema) {
    const target = new targetSchema();

    for (const key in source) {
        if (source.hasOwnProperty(key)) {
            // 检查目标对象是否有该键
            if (targetSchema.path(key)) {
                // 如果是嵌套对象,递归处理
                if (typeof source[key] === 'object' && !Array.isArray(source[key])) {
                    target[key] = copyValue(source[key], targetSchema.path(key).caster.schema);
                } else {
                    target[key] = source[key];
                }
            }
        }
    }

    return target;
}

// 使用复制函数
function docopy(data) {
    const User = mongoose.model('User', UserSchema);

    var user = copyValue(data, UserSchema);

    user.save(function(err) {
        if (err) {
            console.log(err);
        } else {
            console.log('User saved successfully!');
        }
    });
}

docopy(data);

解释

  1. 定义Schema:我们首先定义了UserSchema,包括各种字段如id, tags, msgbody, sms, age, bdlocation, 和 items

  2. 定义数据结构:定义了BdLocationItem对象的结构。

  3. 示例数据:创建了一个包含所有字段的data对象。

  4. 复制函数copyValue函数接受两个参数,一个是源对象source,另一个是目标SchematargetSchema。它会遍历源对象的所有属性,并将这些属性的值复制到目标对象中。如果遇到嵌套对象(如bdlocation),则递归调用copyValue函数。

  5. 使用复制函数:在docopy函数中,我们创建了一个新的User实例,并使用copyValue函数将data中的值复制到新的用户对象中。最后,保存用户对象。

这样,你就可以高效地将一个JSON对象的键值对复制到另一个对象中,而无需手动逐个赋值。


谢谢,我现在试着用,好像也可以,不清楚为什么要判断 Array 和 Object? <code> var user= new UserSchema(); for(var key in data){ user[key]=data[key]; console.log(key+’:’+data[key]); } </code>

因为复制数组返回的是数组,复制对象返回的是对象

为了将一个普通JSON对象的key/value值赋值到另一个对象中同名的key中,你可以使用递归函数来处理嵌套的对象结构。这样可以避免手动为每个属性赋值,提高代码的可维护性和复用性。

以下是一个简单的示例代码,用于实现该功能:

const mongoose = require('mongoose');

// 定义 Schema
var UserSchema = new mongoose.Schema({
    id: mongoose.ObjectId,
    tags: [String],
    msgbody: String,
    sms: Boolean,
    age: Number,
    createtime: { type: Date, default: Date.now },
    bdlocation: {
        id: String,
        area: String,
        city: String
    },
    items: [mongoose.Schema.Types.Mixed]
});

var Item = {
    id: String,
    name: String
};

var BdLocation = {
    id: String,
    area: String,
    city: String
};

// 示例数据
var data = {
    id: '100',
    tags: ['tag1', 'tag2'],
    msgbody: 'hi',
    sms: true,
    age: 30,
    bdlocation: new BdLocation({ id: '200', area: 'area2', city: 'gz' }),
    items: [{}, {}]
};

// 复制函数
function copyValue(src, dest) {
    for (let key in src) {
        if (src.hasOwnProperty(key)) {
            if (typeof src[key] === 'object' && src[key] !== null) {
                if (!dest[key]) {
                    dest[key] = {};
                }
                copyValue(src[key], dest[key]);
            } else {
                dest[key] = src[key];
            }
        }
    }
}

// 创建并复制数据
var user = new UserSchema();
copyValue(data, user);

user.save(function (err) {
    if (err) {
        console.log(err);
    } else {
        console.log("User saved successfully");
    }
});

解释

  1. 定义 Schema:首先定义了 UserSchema 和其他嵌套的 Schema。
  2. 示例数据:定义了一个 data 对象,其中包含需要赋值的所有字段。
  3. 复制函数:定义了一个名为 copyValue 的递归函数,它接受两个参数:源对象 src 和目标对象 dest。该函数遍历源对象的所有属性,并将这些属性的值复制到目标对象中。如果遇到嵌套对象,则递归调用自身。
  4. 创建并复制数据:实例化 UserSchema,然后调用 copyValue 函数将 data 中的数据复制到 user 中。最后保存 user 到数据库。

这种方法适用于复杂嵌套的对象结构,可以大大简化代码并提高可维护性。

回到顶部