Javascript-遍历对象

时间:2020-07-06 07:33:03

标签: javascript json

我正在从服务器中提取一些数据(数据库名称和每个数据库中的特定数据)。 然后,我将数据呈现给用户,用户选择他喜欢的条目,然后将其发送到服务器进行分析。 为了包含用户选择(数据库名称和条目),我动态创建了一个看起来像这样的对象:

enter image description here

因为我不知道将获得哪些数据库和哪些条目,所以我使用Object.defineProperty动态创建对象的数据库名称属性,如下所示:

Object.defineProperty(dbs_list, db_name, {
  value: {},
  writable: true,
  configurable: true
});

构建对象后,我想将其作为JSON对象发送到服务器。在那里,我遇到了我的第一个问题。 JSON.stringify无法在该对象上运行,因为(据我所知)对象属性不是“自有”属性。

据我了解,可能的解决方案是:

  1. 使属性成为“自有”属性-经过一番搜索,我还没有弄清楚该怎么做。
  2. 使对象具有toJSON属性函数-这是我选择的选项。

这是要点:

var selected_entries = {
  toJSON() {
    for (db in this) {
      for (entry in this[db]) {
        //do something
      }
    }
    return json_string;
  }
};

但是在这里我遇到了同样的问题-这些属性不是'own'属性,因此我从第一个循环获得的只是toJson属性。

有没有一种方法来获取条目而不将它们保存在数组中并在其上循环? 或者,是否可以将它们定义为“自有”属性?

1 个答案:

答案 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来获取其名称数组,然后循环遍历。但是我看不出这些是不可枚举的属性。

相关问题