我正在从服务器中提取一些数据(数据库名称和每个数据库中的特定数据)。 然后,我将数据呈现给用户,用户选择他喜欢的条目,然后将其发送到服务器进行分析。 为了包含用户选择(数据库名称和条目),我动态创建了一个看起来像这样的对象:
因为我不知道将获得哪些数据库和哪些条目,所以我使用Object.defineProperty动态创建对象的数据库名称属性,如下所示:
Object.defineProperty(dbs_list, db_name, {
value: {},
writable: true,
configurable: true
});
构建对象后,我想将其作为JSON对象发送到服务器。在那里,我遇到了我的第一个问题。 JSON.stringify无法在该对象上运行,因为(据我所知)对象属性不是“自有”属性。
据我了解,可能的解决方案是:
toJSON
属性函数-这是我选择的选项。这是要点:
var selected_entries = {
toJSON() {
for (db in this) {
for (entry in this[db]) {
//do something
}
}
return json_string;
}
};
但是在这里我遇到了同样的问题-这些属性不是'own'属性,因此我从第一个循环获得的只是toJson
属性。
有没有一种方法来获取条目而不将它们保存在数组中并在其上循环? 或者,是否可以将它们定义为“自有”属性?
答案 0 :(得分:2)
对象上的属性是自己的属性。问题在于它们不是可枚举的。 Service
仅包含可枚举的属性。这就是为什么您在JSON.stringify
循环中看不到它们的原因。 (注意:for-in
不仅枚举自己的属性,还包括继承的属性。但仅包括可枚举的属性。)
要使您的属性枚举,请将for-in
添加到对enumerable: true
的调用中;像所有标志一样,它默认为defineProperty
。
false
但是,在这一点上,您无论如何都只是在定义数据属性,因此简单地执行以下操作会更简单:
Object.defineProperty(dbs_list, db_name, {
value: {},
writable: true,
configurable: true
});
然后dbs_list[db_name] = {};
将起作用。
示例:
JSON.stringify
如果由于某种原因想要使属性不可枚举,则可以使用Object.getOwnPropertyNames
来获取其名称数组,然后循环遍历。但是我看不出这些是不可枚举的属性。