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>
当然可以。根据你的需求,我们可以编写一个简单的函数来将一个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);
解释
-
定义Schema:我们首先定义了
UserSchema
,包括各种字段如id
,tags
,msgbody
,sms
,age
,bdlocation
, 和items
。 -
定义数据结构:定义了
BdLocation
和Item
对象的结构。 -
示例数据:创建了一个包含所有字段的
data
对象。 -
复制函数:
copyValue
函数接受两个参数,一个是源对象source
,另一个是目标SchematargetSchema
。它会遍历源对象的所有属性,并将这些属性的值复制到目标对象中。如果遇到嵌套对象(如bdlocation
),则递归调用copyValue
函数。 -
使用复制函数:在
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");
}
});
解释
- 定义 Schema:首先定义了
UserSchema
和其他嵌套的 Schema。 - 示例数据:定义了一个
data
对象,其中包含需要赋值的所有字段。 - 复制函数:定义了一个名为
copyValue
的递归函数,它接受两个参数:源对象src
和目标对象dest
。该函数遍历源对象的所有属性,并将这些属性的值复制到目标对象中。如果遇到嵌套对象,则递归调用自身。 - 创建并复制数据:实例化
UserSchema
,然后调用copyValue
函数将data
中的数据复制到user
中。最后保存user
到数据库。
这种方法适用于复杂嵌套的对象结构,可以大大简化代码并提高可维护性。