JavaScript ES6 : How to Iterate Over Object with [Symbol()] names

标签 javascript

我试图弄清楚如何迭代使用符号名称来唯一标识属性的对象。例如,如果我有这个对象:

   const bowl1 = {
     'apple': { color: 'red', weight: 136.078 },
     'banana': { color: 'yellow', weight: 183.151 },
     'orange': { color: 'orange', weight: 170.097 },
     'peach': { color: 'yellow', weight: 176.845 }
   };

   for (var fruit in bowl1) {
       var item = bowl1[fruit];
       console.log(`${fruit}: `, item);
   }

   OUTPUT:
   apple:  { color: 'red', weight: 136.078 }
   banana:  { color: 'yellow', weight: 183.151 }
   orange:  { color: 'orange', weight: 170.097 }
   peach:  { color: 'yellow', weight: 176.845 }

   // can even write your own iterator to get the same results
   function* iterate_object(o) {
      var keys = Object.keys(o);
      for (var i = 0; i < keys.length; i++) {
         yield [keys[i], o[keys[i]]];
      }
   }

   // output is the same as above
   for (var [key, val] of iterate_object(bowl1)) {
      console.log(key, val);
   }

但是,如果我更改此对象以使用符号:

   const bowl = {
     [Symbol('apple')]: { color: 'red', weight: 136.078 },
     [Symbol('banana')]: { color: 'yellow', weight: 183.15 },
     [Symbol('orange')]: { color: 'orange', weight: 170.097 },
     [Symbol('banana')]: { color: 'yellow', weight: 176.845 }
   };

请注意,符号用于防止第二个香蕉覆盖第一个香蕉。

无论如何,上面使用的两种方法都无法正确迭代该对象。

有没有办法使用符号名称迭代对象? 是否需要将其创建为类并具有迭代器方法?

预先感谢您的帮助。

最佳答案

您无法获取符号属性名称,因为它们不存储为典型的字符/字符串值,但您可以迭代 Object.getOwnPropertySymbols 返回的列表并使用它们来提取信息对象的。

const bowl = {
     [Symbol('apple')]: { color: 'red', weight: 136.078 },
     [Symbol('banana')]: { color: 'yellow', weight: 183.15 },
     [Symbol('orange')]: { color: 'orange', weight: 170.097 },
     [Symbol('banana')]: { color: 'yellow', weight: 176.845 }
   };
   
for(let sym of Object.getOwnPropertySymbols(bowl) ) {
   console.log(bowl[sym]);
}

关于JavaScript ES6 : How to Iterate Over Object with [Symbol()] names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49113664/

相关文章:

作为参数传递给 onclick() 的 C# 变量未定义

java - Google Web Toolkit,我能用它做什么?

javascript - Bootstrap 3 Collapse - 添加事件类以打开面板

javascript - 如何只让那些 props 传递给组件,组件是根据 switch 决定的

javascript - JQuery 函数对单选按钮不响应

javascript - Node express : Requests are taking Top-level domain as the subdomain ? ?

javascript - 如何使用javascript创建不允许空格的文本框

javascript - 导航栏切换按钮在 Bootstrap v4.1.3 中不起作用

javascript - 多站点与 node.js

javascript - Jquery 使用 next() 选择正确的元素