【问题标题】:Make Underscorejs functions functioning on generators使 Underscorejs 函数在生成器上运行
【发布时间】:2021-07-12 05:49:12
【问题描述】:

我有几十个作用于数组的函数。为便于说明,请参阅 here

如您所见,我使用 Underscorejs 进行大多数操作。

但是我想在我的主要迭代对象上编写一个转换,它是一个 JSON 对象列表,如下所示:

var listings = [{ title: 'title1', d: 0, desc: 'hello world', pass: 'qub7s1ya', tags: ["tag1", "tag2"] }]

因为我想真正优化性能,所以我想在desc 值上编写一个转换器。我将为此使用 lzutf8;这样我就将压缩值存储在磁盘和内存中。在每个 Underscorejs 操作中,我想对键 desc 的解压缩值进行操作。

显然,Underscore 操作不会直接作用于生成器,所以我的问题是如何实现这一点?

Edit1:我相信 Underscorejs 的所有操作都是顺序的,那为什么不支持生成器呢?还是我错过了什么?

Edit2:操作是作用于 JSON 对象或类似数组中的“键值”的操作

_#filter、_#findWhere、_#where、_#reject、_#pick

【问题讨论】:

  • 从我所做的粗略搜索来看,实际上似乎并没有太大的兴趣。我的意思是,ES6 已经 5 岁了……似乎没有人在现代循环或花哨的迭代器中使用下划线(或 lodash)。
  • 可能,当你有足够的精神和 & 意志力时,在那里再次编写所有数组函数。不过不是我:)
  • "显然,下划线操作不直接作用于生成器,所以我的问题是如何实现这一点?"请说明您希望能够做什么,否则将很难回答您的问题。
  • @Bergi “因为 ES6,你不再需要下划线”是每个人都在不断重复的普遍观点,但从根本上说这是不正确的。 Underscore 的大部分功能仍然可从 vanilla JavaScript 中获得,因此除非您一直想重新发明轮子,否则您可以使用(类似的库)Underscore。

标签: javascript json underscore.js generator


【解决方案1】:

起初,我认为生成器能够在运行时更改每个项目,以便能够从压缩的项目中获得纯文本。同样(我认为至少目前如此),可以通过将计算属性附加到 JSON 对象来实现,这在 JavaScript 中是可能的。比如:

var item = {
    desc: "compressed text", 
}

Object.defineProperty(item, 'desc_', {
  get: function() { return decompress(this.desc) }
});
console.log(item.desc_)
console.log(JSON.parse(JSON.stringify(item)))

那么我不担心其他函数作用于desc,只需将desc 替换为desc_

显然,使用Object.defineProperty 添加函数不会影响JSON.stringify,这与使用getter 重新定义另一个JSON 类似:

var item = {
    desc: "hello world", 
    get desc_(){ return (this.desc.toUpperCase()); },
    toJSON() {
      return {
        desc: this.desc 
      }
  }
}

必须定义toJSON,否则desc_ 将被计算并持久化(出于某种原因!)。

返回Underscore.js 问题。所有需要的操作似乎都适用于新的计算属性。

示例:

listings = [{ title: 'title1', d: 0, desc: 'oipfjezojifze', pass: 'qub7s1ya', tags: ["tag1", "tag2"] }]
listings.forEach(item => {
    Object.defineProperty(item, 'desc_', {
        get: function () { return (this.desc.toUpperCase()) }
    });
});
var results = _.where(listings, { desc_: "oipfjezojifze".toUpperCase() })
// it also returns the object intact
console.log(results[0].desc_)
// and other methods _#filter, _#findWhere, _#where, _#reject, _#pick do as well

【讨论】:

    猜你喜欢
    • 2017-08-03
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2015-03-11
    相关资源
    最近更新 更多