【问题标题】:Creating a JS Set inside an Array prototype在 Array 原型中创建 JS Set
【发布时间】:2017-11-16 15:48:50
【问题描述】:

免责声明: 这是为了学习目的,我已经知道给js内置对象添加方法不是一个好习惯。

我正在尝试为一个小型爱好项目的数组原型添加一个新方法:

    Array.prototype.add = function (element) {
      console.log('array before: ' + JSON.stringify(this));
      let arr = this;
      if (arr.length) {
        let set = new Set(arr);
        console.log('set before: ' + JSON.stringify(set));
        console.log('adding element: ' + JSON.stringify(element));
        set = set.add(element);
        console.log('set after: ' + JSON.stringify(set));
      } else {
        arr.push(element);
      }
      console.log('array after: ' + JSON.stringify(arr));
    };

在按预期推送后尝试调用新方法。在连续调用中,“array before:”日志按预期打印,第一次推送构成了数组的内容,但是将数组提供给我的 Set 构造函数会导致一个空集,正如我的“set before:”和“设置后:”记录都打印一个空的{}。我不确定为什么 Set 不会从数组中实例化,任何帮助将不胜感激。

【问题讨论】:

  • 附加:这似乎是我的 Set 声明的问题。我可以用let set = new Set(arr); 代替var set = new Set([0, 1, 2, 3]);,得到相同的结果。
  • 如果你只是console.log(set),你应该可以看到里面有什么。
  • console.log() 可以接受多个参数。 使用它并且不要进行字符串连接。检查一下:console.log('set before:', set)console.log('set before:', [...set])
  • 感谢大家的指正,我都投了赞成票。

标签: javascript arrays set prototype


【解决方案1】:

JSON.stringify 总是导致集合为空对象

var s = new Set([1,2,3]);
console.log(s.size);
console.log(JSON.stringify(s));

集合没有可以序列化的属性。换句话说,您使用了错误的方法来验证集合是否为空并且跳到了错误的结论。改为记录 set.size,或仅记录 set 本身。

相关:JSON stringify a Set

【讨论】:

  • 这种洞察力让我看到了我真正的错误并继续前进。如果我只是继续写出我的代码并包括我转换回数组并返回的步骤,我会没事的。谢谢!
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多