Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将复杂的普通对象转换为领域对象?_Javascript_Json_Node.js_Realm - Fatal编程技术网

Javascript 将复杂的普通对象转换为领域对象?

Javascript 将复杂的普通对象转换为领域对象?,javascript,json,node.js,realm,Javascript,Json,Node.js,Realm,我试图将接收到的纯javascript对象转换和/或直接传递给Realm对象,但在这方面遇到了困难 “设置”-接收到的普通对象(领域对象转换为Json并返回) 下面是一个简单的模式示例: exports.Settings = { name: 'Settings', primaryKey: 'Id', properties: { Id: 'string', User: 'User', FavoriteChanne

我试图将接收到的纯javascript对象转换和/或直接传递给Realm对象,但在这方面遇到了困难

“设置”-接收到的普通对象(领域对象转换为Json并返回)

下面是一个简单的模式示例:

exports.Settings = {
    name: 'Settings',
    primaryKey: 'Id',
    properties: {
        Id: 'string',
        User: 'User',       
        FavoriteChannels: 'Channel[]',
    }
};

exports.User = {
    name: 'User',
    primaryKey: 'Id',
    properties: {
        Id: 'string',
        FirstName: 'string?',
        LastName: 'string?',            
        PhoneNumbers: 'PhoneNumber[]'           
    }
};

exports.PhoneNumber = {
    name: 'PhoneNumber',
    primaryKey: 'Id',
    properties: {
        Id: 'string',        
        Number: 'string',
    }
};

exports.Channel = {
    name: 'Channel',
    primaryKey: 'Id',
    properties: {
        Id: 'string',           
        ChannelName: 'string?',         
        Users: 'User[]',            
    }
};  
如果我试图直接在“realm.create”中传递“settings”,则会出现以下错误:

用户。电话号码
必须是
'PhoneNumber[]'
,got
'object'([object object]

它需要一个数组,但普通对象的集合反序列化为对象/字典?(例如
电话号码:{'0':[object]})
。反序列化程序无法知道如何将领域对象的
“List{}”
(例如
[PhoneNumbers]:List{[0]:[object]})
解析为数组


Realm似乎缺少这类操作的“对称性”,除非我遗漏了什么。

解决这个问题的一种方法是在客户端简单地使用对象构造函数,例如:

//file "dataModel.js"
export function Settings(obj) {
    this.Id = obj.Id;
    this.User = new User(obj.User); //check for null, if property in the schema is nullable, so you don't pass empty objects to Realm - example: obj.User ? new User(obj.User) : null;
    this.FavoriteChannels = Object.values(obj.FavoriteChannels).map(m => new Channel(m));
}

export function User(obj) {
    this.Id = obj.Id;
    this.FirstName = ojb.FirstName;
    this.LastName = obj.LastName;
    PhoneNumbers = Object.values(obj.PhoneNubmers).map(m => new PhoneNumber(m));
}

export function PhoneNumber(obj) {
    this.Id = obj.Id;
    this.Nubmer = obj.Number;
}

export function Channel(obj) {
    this.Id = obj.Id;
    this.ChannelName = obj.ChannelName;
    this.Users = Object.values(obj.Users).map(m => new User(m));
}


//file app.js
import * as dataModel from 'path-to-dataModel';
...
//receive data from server and create Settings using the constructor from dataModel
const testObj = new dataModel.Settings(plainSettingsObjectFromServer);  
//make any changes to the testObj and send it back to server
现在,我们可以将从客户端接收的普通对象传递到Realm。创建:

realm.create('Settings', {
    Id: plainSettingsObject.Id,
    User: plainSettingsObject.User,
    FavoriteChannels: plainSettingsObject.FavoriteChannels,
}, true)

如何将其转换为JSON?为什么要将其全部取出,然后全部放回?我假设您将其取出,更新一个值,然后再将其推回?如果是这样,为什么不更新写入中的原始对象并跳过所有转换?您可以使用简单的JSON.stringify()将其转换为JSON.至于数据,让我这样说吧-服务器通过套接字(对数据进行序列化和反序列化)向客户端发送领域对象,然后客户端可以进行更改并将其发送回服务器。
realm.create('Settings', {
    Id: plainSettingsObject.Id,
    User: plainSettingsObject.User,
    FavoriteChannels: plainSettingsObject.FavoriteChannels,
}, true)